kruskal算法
Kruskal算法用于求稀疏图的最小生成树
将所有边按权重从小到大排序mlog(m)
枚举每条边(得到点a,点b以及权重w)
如果a,b不连通则将这条边加入到集合中
import heapq
# 当点的数量n**2 >= 边的数量m时 为稀疏图 使用堆优化Dijkstra
n, m = [int(x) for x in input().split(" ")]
# dist 记录每个点离起点的距离
dist = [float('inf')] * (n + 1)
lst = list()
heapq.heapify(lst)
for _ in range(m):
a, b, w = [int(x) for x in input().split(" ")]
# 按照边的权重排序
heapq.heappush(lst, (w, a, b))
p = [0] * (n + 1)
# 初始化并查集
for i in range(1, n + 1):
p[i] = i
def find(x):
if p[x] != x:
p[x] = find(p[x])
return p[x]
ans = 0
cnt = 0
while lst:
w, a, b = heapq.heappop(lst)
a = find(a)
b = find(b)
if a != b:
p[a] = b
ans += w
cnt += 1
if cnt < n - 1:
# 表示没有生成树的方案
print(-1)
else:
print(ans)
"""
IN:
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
OUT:
6
"""
最后更新于
这有帮助吗?