Kruskal实现最小生成树

Kruskal实现最小生成树

算法原理:

一群孤立的顶点,在不形成环的情况下不断把最小的边连接起来。

如何描述不形成环?

1、书上的描述,把连接的顶点,标记为同一个连通分量,线段的起点 V i V_i V j V_j 属于不同的连通分量即可,实现比较简单,只要一个标记数组就可以实现。

2、还有一种描述,不使用连通分量方式,检测回路,类似于 V i V_i .parent != V j V_j ,目前思考还不成熟。

代码实现:

def kruskal2(graph):
    vnum = len(graph)
    pqueue = []
    for head in graph:
        for tail in graph[head].keys():
            heapq.heappush(pqueue,(graph[head][tail],head,tail))
            
    reps = {vertex:vertex for vertex in graph}   
    mst = {vertex : None for vertex in graph}
    count = 0
    
    while count < vnum and pqueue:
        pair = heapq.heappop(pqueue)
        weight = pair[0]
        head = pair[1]
        tail = pair[2]
        
        if reps[head] == reps[tail]:
            continue
        
        mst[tail]=(head,weight)
        
        for v in graph:
            if reps[v] == reps[tail]:
                reps[v]=reps[head]               
        count += 1
    return mst  

输出结果:

     #%%
    g = {'A':{'B':1,'C':2},
         'B':{'A':1,'C':3,'D':4},
         'C':{'A':2,'B':3,'D':5,'E':6},
         'D':{'B':4,'C':5,'E':7,'F':8},
         'E':{'C':6,'D':7,'G':9},
         'F':{'D':8},
         'G':{'E':9}
        }
    t=kruskal(g)
    print t   

    m=kruskal2(g)
    print m  

{'A': None, 'C': ('A', 2), 'B': ('A', 1), 'E': ('C', 6), 'D': ('B', 4), 'G': ('E', 9), 'F': ('D', 8)}
{'A': None, 'C': ('A', 2), 'B': ('A', 1), 'E': ('C', 6), 'D': ('B', 4), 'G': ('E', 9), 'F': ('D', 8)}

猜你喜欢

转载自blog.csdn.net/weixin_40759186/article/details/83858827