AcWing 859. Kruskal算法求最小生成树-python
原题链接
简单
作者:
Actor丶
,
2020-02-25 19:37:05
,
所有人可见
,
阅读 992
def find(x):
"""并查集的模板"""
if p[x]!=x:
p[x] = find(p[x])
return p[x]
def kruskal():
res = 0 # 存储最小权重和
cnt = 0 # 存储当前连通块的边数
edges.sort(key=lambda s:s[2]) # 1. 对所有边按照权重升序排序
for a,b,w in edges: # 2. 遍历所有边,如果边的两个节点不连通,就将这两个点添加到并查集的集合中
if find(a)!=find(b):
p[find(a)] = find(b)
res += w
cnt += 1
if cnt==n-1: # !!!出错:不能写成if cnt>n-1,因为没有考虑不存在连通图的情况
return res
return False
if __name__=="__main__":
n, m = map(int, input().split())
p = [i for i in range(n+1)] # 初始化i的父节点为i节点自己
edges = [] # 存储图的边,与Bellman-Fold算法的存储方式相同
while m:
u, v, w = map(int, input().split())
edges.append((u, v, w))
m -= 1
res = kruskal()
print(res) if res else print("impossible")