クラスカル法 (Kruskal’s Algorithm)

概要

グラフ\(G\)上の最小全域木(Minimum Spanning Tree)を求める。

クラスカル法では、コストが小さい辺から、連結でない頂点同士を繋いでいくことで、最小全域木を求める。

計算量

\(O(|E| \log |V|)\)

実装

# E = [(cost, v, w), ...]
#   G上の全ての辺(v, w)とそのcostを含むlist

# Union-Findを使うことで頂点間の連結判定を行う
*p, = range(N)
def root(x):
    if x == p[x]:
        return x
    p[x] = y = root(p[x])
    return y

def unite(x, y):
    px = root(x); py = root(y)
    if px == py:
        return 0
    if px < py:
        p[py] = px
    else:
        p[px] = py
    return 1

E.sort()
ans = 0
for c, v, w in E:
    if unite(v, w):
        ans += c

# ansが最小全域木の解

Verified

  • AOJ: "ALDS1_12_A: Graph II - Minimum Spanning Tree": source (Python3, 0.02sec)