单源最短路径算法步骤及代码(必须有每行注释)
时间: 2024-01-12 12:03:40 浏览: 76
单源最短路径算法用于求解一个节点到其他节点的最短路径。其中最著名的算法是 Dijkstra 算法。下面是 Dijkstra 算法的步骤及代码。
步骤:
1. 创建一个空的集合 visited,用于存储已经找到最短路径的节点。
2. 创建一个空的字典 distances,用于存储每个节点到起点的距离,初始值为无穷大。
3. 将起点加入 visited 集合中,并将 distances 中起点的距离设为 0。
4. 对于起点的每个邻居,计算起点到该邻居的距离,并更新 distances 中该邻居的距离。
5. 从未加入 visited 集合的节点中,选择 distances 最小的节点作为下一个要加入 visited 集合中的节点。
6. 重复步骤 4 和 5,直到所有节点都被加入 visited 集合中。
7. distances 中的值即为起点到其他节点的最短路径。
代码:
```python
import heapq
def dijkstra(graph, start):
# 创建 visited 集合,用于存储已经找到最短路径的节点
visited = set()
# 创建 distances 字典,用于存储每个节点到起点的距离
# 初始值为无穷大
distances = {node: float('inf') for node in graph}
# 将起点加入 visited 集合中,并将 distances 中起点的距离设为 0
distances[start] = 0
# 创建一个优先队列,用于存储未加入 visited 集合的节点
# 优先队列中的元素为 (距离,节点) 的元组
priority_queue = [(0, start)]
while priority_queue:
# 从优先队列中取出距离最小的节点
current_distance, current_node = heapq.heappop(priority_queue)
# 如果该节点已经在 visited 集合中,则跳过
if current_node in visited:
continue
# 将该节点加入 visited 集合中
visited.add(current_node)
# 对于当前节点的每个邻居,计算起点到该邻居的距离,并更新 distances 中该邻居的距离
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
return distances
```
其中,graph 是一个字典,表示图的邻接表。例如,如果有一条边从节点 A 到节点 B,权重为 5,则 graph 中应该有 graph['A']['B'] = 5。start 是起点。
阅读全文