PriorityQueue 实现 Dijkstra 算法的具体代码
时间: 2023-10-19 13:18:20 浏览: 93
好的,下面是使用 PriorityQueue 实现 Dijkstra 算法的 Python 代码示例:
```python
import heapq
def dijkstra(graph, start):
"""
使用Dijkstra算法计算图中最短路径
:param graph: 图
:param start: 起点
:return: 距离和前驱
"""
# 初始化距离和前驱
distance = {node: float('inf') for node in graph}
distance[start] = 0
predecessor = {node: None for node in graph}
# 初始化 PriorityQueue,将起点加入队列中
queue = [(0, start)]
while queue:
# 取出具有最高优先级的节点
curr_distance, curr_node = heapq.heappop(queue)
# 如果当前节点的距离已经大于已知的最短距离,则忽略
if curr_distance > distance[curr_node]:
continue
# 遍历该节点的所有邻居
for neighbor, weight in graph[curr_node].items():
# 计算新的距离
new_distance = curr_distance + weight
# 如果该邻居节点未被访问过或者新的路径比旧路径更短
if new_distance < distance[neighbor]:
# 更新该邻居节点的距离和前驱
distance[neighbor] = new_distance
predecessor[neighbor] = curr_node
# 将该邻居节点加入 PriorityQueue 中
heapq.heappush(queue, (new_distance, neighbor))
return distance, predecessor
```
在这个示例中,我们首先初始化距离和前驱数组,然后将起点加入 PriorityQueue 中。在 while 循环中,我们取出具有最高优先级的节点,并遍历该节点的所有邻居,计算新的距离并更新距离和前驱数组。如果该邻居节点未被访问过或者新的路径比旧路径更短,我们将该邻居节点加入 PriorityQueue 中。最终返回距离和前驱数组。
阅读全文