AcWing 858. Prim算法求最小生成树-python
原题链接
简单
作者:
Actor丶
,
2020-02-25 09:12:42
,
所有人可见
,
阅读 1534
def prim():
dist = [float("inf") for i in range(n+1)] # 记录每个结点到连通块的距离
st = [False for i in range(n+1)] # 标记节点是否在连通块中
res = 0
for i in range(1, n+1):
t = 0
for j in range(1,n+1): # 未访问过的寻找距离连通块距离最近的节点
if st[j]==False and (t==0 or dist[t]>dist[j]):
t = j
if t==0 and dist[t]==float("inf"): return float("inf") # 如果上面的for循环没有找到距离连通块最近的点
if t!=1: # 如果节点t不是第一个点,就将t到连通块的距离加到res中;!!!注意,res的加和操作一定放在更新距离操作之前,否则加和一定是0
res += dist[t]
for j in range(1,n+1): # 更新所有节点到连通块的距离,其中dist[t]更新为0
dist[j] = min(dist[j], graph[t][j])
st[t] = True
return res
# 输入示例
if __name__=="__main__":
n, m = map(int, input().split())
# 邻接矩阵存无向图
graph = [[float("inf") for i in range(n+1)] for j in range(n+1)]
while m:
u, v, w = map(int, input().split())
graph[u][v] = graph[v][u] = min(graph[u][v], w) # 存储无向图的邻接矩阵
m -= 1
for i in range(1, n+1):
graph[i][i] = 0
res = prim()
print("impossible") if res>=float("inf")/2 else print(res)
float(“inf”)/2 这个没有啥意义呐