编写程序实现用Prim算法对下图求最小生成树。
时间: 2024-02-16 09:00:47 浏览: 53
实现构造最小生成树的Prim算法
很好,下面是用Prim算法求解最小生成树的程序实现,假设图的邻接矩阵为adj,n为节点数:
```python
INF = float('inf') # 定义无穷大的值
def prim(adj, n):
"""
使用Prim算法求解最小生成树
:param adj: 邻接矩阵
:param n: 节点数
:return: 最小生成树的边集
"""
lowcost = [INF] * n # 记录节点到树的最小边权值
closest = [0] * n # 记录节点到树的最小边的邻接点
selected = [False] * n # 记录节点是否已经加入最小生成树
selected[0] = True # 从第一个节点开始构建最小生成树
edges = [] # 最小生成树的边集
# 初始化最小边权值和最小边邻接点数组
for i in range(1, n):
lowcost[i] = adj[0][i]
closest[i] = 0
for _ in range(n - 1):
minval = INF
j = 0
# 找到当前未加入树的节点中,到树的最小边权值最小的节点
for i in range(1, n):
if not selected[i] and lowcost[i] < minval:
minval = lowcost[i]
j = i
# 将该节点加入树中
selected[j] = True
# 将该节点与树的最小边加入最小生成树的边集
edges.append((closest[j], j))
# 更新其他未加入树的节点到树的最小边权值和最小边邻接点数组
for i in range(1, n):
if not selected[i] and adj[j][i] < lowcost[i]:
lowcost[i] = adj[j][i]
closest[i] = j
return edges
```
对于下图,可以使用邻接矩阵表示如下:
```
0 1 2 3 4
--------------------
0 | 0 6 INF 1 5
1 | 6 0 5 2 INF
2 | INF 5 0 INF 6
3 | 1 2 INF 0 4
4 | 5 INF 6 4 0
```
调用prim函数即可求解最小生成树的边集。
阅读全文