有几个分量,最大的那个多大

👁️ 0 人浏览 💬 0 人评论 ❤️ 添加收藏

还是那七个点,这次5 → 3 那条边加回来,于是图里有了环:

G = [(0, 1), (0, 2), (1, 3), (2, 3), (3, 4), (4, 5), (5, 3), (4, 6)]
N = 7

def build(edges):
    g = {u: [] for u in range(N)}
    for a, b in edges:
        g[a].append(b)
    for u in g:
        g[u].sort()
    return g

def kosaraju(edges, second_reversed=True):
    g = build(edges)
    rg = build([(b, a) for a, b in edges])
    seen, order = set(), []
    for s in range(N):
        if s in seen:
            continue
        st = [(s, iter(g[s]))]
        seen.add(s)
        while st:
            u, it = st[-1]
            for v in it:
                if v not in seen:
                    seen.add(v)
                    st.append((v, iter(g[v])))
                    break
            else:
                order.append(u)
                st.pop()
    second = rg if second_reversed else g
    seen2, groups = set(), []
    for s in reversed(order):
        if s in seen2:
            continue
        st, grp = [s], []
        seen2.add(s)
        while st:
            u = st.pop()
            grp.append(u)
            for v in second[u]:
                if v not in seen2:
                    seen2.add(v)
                    st.append(v)
        groups.append(sorted(grp))
    return sorted(groups)

gs = kosaraju(G)
print(str(len(gs)) + "/" + str(max(len(x) for x in gs)))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论