python中PriorityQueue 实现 Dijkstra 算法的具体代码
时间: 2023-12-24 21:11:44 浏览: 72
Dijkstra算法代码
刚才的回答是 Python 代码,如果你需要更详细的实现代码,下面是一个完整的 Python 实现:
```python
import heapq
def dijkstra(graph, start):
# 初始化距离和前驱数组
distances = {node: float('inf') for node in graph}
distances[start] = 0
predecessors = {node: None for node in graph}
# 初始化 PriorityQueue,将起点加入队列中
queue = [(0, start)]
while queue:
# 取出具有最高优先级的节点
current_distance, current_node = heapq.heappop(queue)
# 如果当前节点的距离已经大于已知的最短距离,则忽略
if current_distance > distances[current_node]:
continue
# 遍历该节点的所有邻居
for neighbor, weight in graph[current_node].items():
# 计算新的距离
distance = current_distance + weight
# 如果该邻居节点未被访问过或者新的路径比旧路径更短
if distance < distances[neighbor]:
# 更新该邻居节点的距离和前驱
distances[neighbor] = distance
predecessors[neighbor] = current_node
# 将该邻居节点加入 PriorityQueue 中
heapq.heappush(queue, (distance, neighbor))
return distances, predecessors
# 示例
graph = {
'A': {'B': 2, 'C': 6},
'B': {'D': 3},
'C': {'D': 1},
'D': {}
}
distances, predecessors = dijkstra(graph, 'A')
print(distances)
print(predecessors)
```
在这个示例中,我们使用了 Python 内置的 heapq 模块来实现 PriorityQueue。我们首先初始化距离和前驱数组,然后将起点加入 PriorityQueue 中。在 while 循环中,我们取出具有最高优先级的节点,并遍历该节点的所有邻居,计算新的距离并更新距离和前驱数组。如果该邻居节点未被访问过或者新的路径比旧路径更短,我们将该邻居节点加入 PriorityQueue 中。最终返回距离和前驱数组。
阅读全文