用n - 1条边将n个点连起来,当n - 1条边的权值之和最小,形成的树就是最小生成树
如这张图:
的最小生成树为
4条边将5个点连起来,权值之和为7
问题:给你一个n个点的带权无向连通图,节点编号为0到n - 1,同时还有一个数组edges,其中edges[i] = [from,to,weight] 表示在from和to节点之间有一条权值为weight的无向边,求这个图的最小生成树的权值和
下面用kruskal算法解决该问题:
步骤:
1、cnt记录当前生成树中的边数,res记录权值之和
2、将edges按权值排序
3、遍历edges,如果当前遍历到的这条边不在生成树中,cnt += 1,res += 这条边的权值,并将这条边合并到生成树中
4、当cnt = n - 1时,说明生成树中已经有n - 1条边,此时res就是答案
def MST(n, edges):
edges.sort(key = lambda x : x[2])
p = list(range(n))
def find(x):
if x != p[x]:
p[x] = find(p[x])
return p[x]
cnt, res = 0, 0
for i in edges:
if find(i[0]) != find(i[1]):
p[find(i[0])] = find(i[1])
cnt += 1
res += i[2]
if cnt == n - 1:
return res
return -1