给出从一个顶点出发prim算法构建的最小生成树代码
时间: 2023-07-22 17:32:31 浏览: 101
Prim与Kruskal算法的最小生成树matlab实现
5星 · 资源好评率100%
以下是使用Prim算法构建最小生成树的代码示例,其中使用了优先队列(Priority Queue)来实现节点的选择:
```python
import heapq
def prim_algorithm(adjacency_matrix):
num_vertices = len(adjacency_matrix)
visited = [False] * num_vertices
MST = []
start_vertex = 0
visited[start_vertex] = True
edges = [(weight, start_vertex, j) for j, weight in enumerate(adjacency_matrix[start_vertex]) if weight > 0]
heapq.heapify(edges)
while edges:
weight, u, v = heapq.heappop(edges)
if visited[v]:
continue
visited[v] = True
MST.append((u, v, weight))
for j, weight in enumerate(adjacency_matrix[v]):
if weight > 0 and not visited[j]:
heapq.heappush(edges, (weight, v, j))
return MST
```
其中,adjacency_matrix 是一个邻接矩阵,表示图的边权值;num_vertices 表示图的顶点数;visited 数组记录每个顶点是否已经被访问;MST 保存最小生成树的边集合;start_vertex 是选择的起始顶点。
在算法的实现中,首先将起始顶点标记为已访问,然后将与它相邻的边加入到优先队列中,每次从队列中取出权值最小的边进行处理。如果边连接的顶点已经被访问过,则直接跳过;否则将该顶点标记为已访问,并将该边加入到最小生成树中。然后将该顶点的所有相邻边加入到优先队列中,重复以上步骤,直到所有顶点都被访问过。
阅读全文