- 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)