python使用邻接表方式实现dijkstra单源最短路径算法
时间: 2024-01-27 20:03:47 浏览: 81
好的,以下是使用邻接表方式实现Dijkstra单源最短路径算法的Python代码:
```python
import heapq
# 无穷大表示两个节点不连通
INF = float("inf")
def dijkstra(graph, start):
"""
使用Dijkstra算法计算图中start节点到其他节点的最短路径
:param graph: 邻接表表示的图
:param start: 起始节点
:return: 起始节点到各个节点的最短路径长度
"""
# 初始化距离为无穷大
dist = {node: INF for node in graph}
# 起始节点到自身的距离为0
dist[start] = 0
# 使用堆优化,使得每次取出距离最小的节点
heap = [(0, start)]
while heap:
# 取出距离最小的节点和距离
(d, node) = heapq.heappop(heap)
# 如果当前节点已经处理过,跳过
if d > dist[node]:
continue
# 遍历当前节点的邻居节点
for neighbor, weight in graph[node].items():
# 计算从起始节点到邻居节点的距离
distance = dist[node] + weight
# 如果新的距离比原来的距离小,更新距离
if distance < dist[neighbor]:
dist[neighbor] = distance
# 将邻居节点加入堆中
heapq.heappush(heap, (distance, neighbor))
return dist
```
使用示例:
```python
graph = {
"A": {"B": 5, "C": 1},
"B": {"A": 5, "C": 2, "D": 1},
"C": {"A": 1, "B": 2, "D": 4, "E": 8},
"D": {"B": 1, "C": 4, "E": 3, "F": 6},
"E": {"C": 8, "D": 3},
"F": {"D": 6}
}
print(dijkstra(graph, "A"))
```
输出结果:
```
{'A': 0, 'B': 3, 'C': 1, 'D': 4, 'E': 7, 'F': 10}
```
其中,字典中的键表示节点,值表示起始节点到该节点的最短路径长度。
阅读全文