dsu - shakayami/ACL-for-python GitHub Wiki

dsu

disjoint set union,つまりUnionFind木です. 主な使用例としては,最小全域木問題をクラスカル法で解くときなどに使います.

初期化

G=dsu(N)

ここで,Nは頂点の数です.

merge

G.merge(a,b)

頂点aがある連結成分と頂点bがある連結成分を合体します.

same

G.same(a,b)

これは,「頂点aと頂点bが同じ連結成分」ならばTrue,そうでないならばFalseを返します.

leader

G.leader(a)

aの連結成分の代表元を返します.

size

G.size(a)

aの連結成分にある頂点数(aを含む)を答えます.

groups

G.groups()

グラフの連結成分の情報を答えます.

使用例

使用例1

(https://atcoder.jp/contests/practice2/tasks/practice2_a)

class dsu():
    #(中略)
N,Q=map(int,input().split())
G=dsu(N)
for i in range(Q):
    t,u,v=map(int,input().split())
    if t==0:
        G.merge(u,v)
    else:
        print(1 if G.same(u,v) else 0)

入力例1に対する出力

0
1
0
1

使用例2

class dsu():
    #(中略)

N=10
G=dsu(N)
print([G.leader(i) for i in range(N)])
for i in range(5):
    G.merge(2*i,2*i+1)
print([G.leader(i) for i in range(N)])
G.merge(1,3)
print(G.size(0))
print(G.groups())

出力

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 0, 2, 2, 4, 4, 6, 6, 8, 8]
4
[0, 1, 2, 3], [4, 5], [6, 7], [8, 9](/shakayami/ACL-for-python/wiki/0,-1,-2,-3],-[4,-5],-[6,-7],-[8,-9)