Python 数据结构与算法 —— Kruskal 算法

来源:互联网 发布:java 301跳转 编辑:程序博客网 时间:2024/06/08 08:26

1. 朴素版

# 查def naive_find(C, u):    while C[u] != u:        u = C[u]    return u# 并 def naive_union(C, u, v):    u = naive_find(C, u)    v = naive_find(C, v)    C[u] = vdef naive_kruskal(G):    E = [(G[u][v], u, v) for u in G for v in G[u]]    T = set()    for _, u, v in sorted(E):        if naive_find(C, u) != naive_find(C, v):            T.add((u, v))            naive_union(u, v)    return T

2. 使用 path compression

# 查def find(C, u):    if u != C[u]:        C[u] = find(C, C[C[u]])    return C[u]# 并def union(C, R, u, v):    u = find(C, u)    v = find(C, v)    if R[u] > R[v]:        C[v] = u    else:        C[u] = v    if R[u] == R[v]:        R[v] += 1def kruskal(G):    E = [(G[u][v], u, v) for u in G for v in G[u]]    T = set()    C, R = {u:u for u in G}, {u:0 for u in G}    for _, u, v in sorted(G):        if find(C, u) != find(C, v):            T.add(set(u, v))            union(C, R, u, v)    return T

算法的实现算法的优化及改进,都有赖相关数据结构。

0 0