ここでは、例えば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 JUDGEAtCoder に特集ページがありますので、挑戦してみましょう!