朴素Prim算法
朴素版Prim算法适用与稠密图;堆优化版Prim算法可用于稀疏图,但一般情况下稀疏图的最小生成树问题选择Kruskal算法
Prim算法能够得到任意加权连通图的最小生成树
朴素版Prim
初始化dist(距离数组)距离为正无穷(一个极大的数)
迭代每一个点,找到集合(st,当前已经在联通块中的点)外且距离最小的点t
把t加入到集合中(st[t]=true)
使用t去更新其他点到集合的距离
n, m = [int(x) for x in input().split(" ")]
# g 稠密图(m>n**2, 即边的数量大于点的数量)使用邻接矩阵进行存储
g = [[float('inf')] * (n + 1) for _ in range(n + 1)]
for _ in range(m):
a, b, w = [int(x) for x in input().split(" ")]
# 自环
if a == b:
continue
g[a][b] = g[b][a] = min(g[a][b], w)
# 每个点到起点的距离
dist = [float('inf')] * (n + 1)
# 集合
st = set()
ans = 0
for x in range(n):
# t 存储当前访问的点
t = -1
# 题目中点的标识从1开始
for i in range(1, n + 1):
if i not in st and (t == -1 or dist[t] > dist[i]):
t = i
if x and dist[t] == float('inf'):
ans = float('inf')
break
if x:
ans += dist[t]
st.add(t)
# 使用t去更新其他点到集合的距离
for i in range(1, n + 1):
dist[i] = min(dist[i], g[t][i])
if ans == float('inf'):
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
"""
最后更新于
这有帮助吗?