最小生成树 Kruskal算法

  1. Kruskal算法是从边出发,计算最小生成树的算法。具体的,依照权重大小遍历所有的边,若改边跨越两个连通分量,并更新连通分量情况,直至遍历所有的边。
  • 1依次选择跨不同连通分量的代价最小边
  • 2 直到T中所有的顶点都在同一连通分量上或者遍历完所有边

2.详见下例


幻灯片1.jpg
幻灯片2.jpg
幻灯片3.jpg
幻灯片4.jpg
幻灯片5.jpg
幻灯片6.jpg

3.参考代码
kruskal算法的难点在于如何确定跨越不同的连通分量的边


Inf = float('inf')

def load_graph():
    N=6
    graph = [[0, 1, 12, Inf, Inf, Inf],
             [1, 0, 9, 3, Inf, Inf],
             [12, 9, 0, 4, 5, Inf],
             [Inf, 3, 4, 0, 13, 15],
             [Inf, Inf, 5, 13, 0, 4],
             [Inf, Inf, Inf, 15, 4, 0]]

    return graph,N

#将两个不同group的值保持一致,默认取group[i]的值
def update_group(i,j,group):
    tag = group[i]
    change = group[j]
    for k in range(len(group)):
        if group[k] == change:
            group[k]=tag



if __name__ == '__main__':

    graph,N = load_graph()

    #连通分量
    group = list(range(N))

    #计算edges
    edges = []
    for i in range(N):
        for j in range(i):
            if graph[i][j]>0 and graph[i][j]!=Inf:
                edges.append((graph[i][j],(i,j)))

    #sort
    edges = sorted(edges,key=lambda asv:asv[0],reverse=False)

    MCST = []

    for cost,(i,j) in edges:
        #位于不同连通分量group上
        if group[i]!=group[j]:
            #更新连通分量,保存edge
            update_group(i,j,group)
            MCST.append((i,j))
    print(MCST)



4.优缺点

  • 优点
    适合点多边少的稀疏图情况。算法复杂度为O(eloge)

你可能感兴趣的:(最小生成树 Kruskal算法)