ここでは、例えばAtCoderであればC問題あたりから使うことのある「UnionFind」を python3 で実装する方法を紹介します。
以下が「UnionFind」の骨格となるコードです。
#各頂点(要素)の根(親)を管理する配列:初期値は各頂点自身, 頂点数は N
root = [i for i in range(N+1)]
#各頂点(要素)の高さを管理する配列:初期値は最下位の0
rank = [0]*(N+1)
#頂点xの根(親)を見つける関数:戻り値は根(親)の頂点番号
def find(x):
#print(x, root)
if root[x] == x:
return x
else:
root[x] = find(root[x])
return root[x]
#頂点xと頂点yが同じ根(親)を持つかを判定する関数:戻り値はBoolean(True or False)
def same(x,y):
return find(x) == find(y)
#頂点xと頂点yが所属するグループを併合する関数
def unite(x,y):
x = find(x)
y = find(y)
if x == y:
return 0
#浅い(木の高さとして低い)方を深い(高い)方に合併
if rank[x] < rank[y]:
root[x] = y
else:
root[y] = x
if rank[x] == rank[y]:
rank[x] += 1
上記のコードを実装すれば、
find(x) というコードで 頂点x の根を取得でき、
same(x, y) というコードで 頂点x と 頂点y の根が同じであるかを判定でき、
unite(x, y) というコードで 頂点x と 頂点y を同じ根に併合することができます。
また、rank[x] と配列を参照すれば、頂点x の高さが取得できます。
AIZU ONLINE JUDGE や AtCoder に特集ページがありますので、挑戦してみましょう!