在邻接链表数据结构中,Prim算法的具体实现步骤是什么?能否提供一个使用Prim算法求最小生成树的示例代码片段?
时间: 2024-12-19 08:17:11 浏览: 27
在邻接链表表示图的数据结构中,Prim算法用于寻找带权无向图的最小生成树,其基本步骤如下:
1. 初始化:选择一个顶点(通常是任意一个)作为起点,并将其加入到已访问集合中。
2. 扩展:对于未访问的所有邻居,计算它们到已访问顶点的距离。选取距离最短的那个邻居,如果它是新发现的,则添加到已访问集合并更新边权重。
3. 重复:直到所有顶点都被访问过,或无法找到更小权重的边。
这是一个简单的Python代码片段,使用邻接链表和优先队列实现Prim算法:
```python
import heapq
def prim(graph, start):
visited = {start: 0}
edges = [(weight, neighbor) for neighbor, weight in graph[start].items()]
heap = [(0, start)]
while edges:
_, current = heapq.heappop(heap)
if current not in visited:
visited[current] = True
for neighbor, weight in graph[current].items():
if neighbor not in visited:
heapq.heappush(heap, (weight, neighbor))
return visited, sum(visited.values()) - graph[start][start]
# 示例图,邻接链表表示法
graph = {
'A': {'B': 2, 'D': 4},
'B': {'A': 2, 'C': 1, 'D': 5},
'C': {'B': 1, 'E': 7},
'D': {'A': 4, 'B': 5, 'E': 9},
'E': {'C': 7, 'D': 9}
}
start_node = 'A'
min_tree, min_cost = prim(graph, start_node)
print(f"Minimum spanning tree with cost {min_cost}:")
for node, is_visited in min_tree.items():
if is_visited:
print(f"{node} - ", end="")
```
在这个例子中,`graph`是一个字典,键是节点,值是另一个字典,表示连接到其他节点的边及其权重。`prim`函数返回最小生成树以及最小总成本。
阅读全文