已知交通图及其运行里程权重,如图1所示。用迪杰斯特拉Dijkstra算法求西宁到其他所有城市的最短路径,打印输出城市起点终点,途经城市和最短路径长度。
时间: 2024-03-03 20:51:35 浏览: 94
Big_Test1.0_迪杰斯特拉算法_Big!_bigtets.com_图的最短路径问题_
好的,我可以为您介绍一下Dijkstra算法的具体步骤,并提供一份实现该算法的Python代码。
Dijkstra算法是一种用于解决单源最短路径问题的贪心算法,通过不断从未确定最短路径的节点集合中选取距离最短的节点来求解最短路径。
具体步骤如下:
1. 初始化
- 将起点的距离设为0,将所有其他节点的距离设为无穷大。
- 将起点标记为已访问,将其加入已确定最短路径的节点集合中。
2. 更新距离
- 遍历起点的所有邻居节点,计算起点到这些节点的距离,并将这些距离与当前记录的距离进行比较。如果计算出来的距离更短,则更新距离。
- 从未确定最短路径的节点集合中选取距离最短的节点,将其标记为已访问,并将其加入已确定最短路径的节点集合中。
3. 重复第二步,直到所有节点都被访问过。
下面是一份用Python实现Dijkstra算法的代码,代码中包含了关于上述步骤的详细注释。
```python
import heapq
# 构建图(邻接矩阵表示法)
graph = [
[0, 2, 1, 4, 5],
[2, 0, 4, 2, 3],
[1, 4, 0, 1, 2],
[4, 2, 1, 0, 1],
[5, 3, 2, 1, 0]
]
# 起点
start = 0
# 记录起点到其他节点的最短距离
distances = {i: float('inf') for i in range(len(graph))}
distances[start] = 0
# 记录路径
paths = {start: []}
# 记录已访问的节点
visited = set()
# 优先队列(堆)用于选取距离最短的节点
pq = [(0, start)]
while pq:
(distance, current_node) = heapq.heappop(pq)
# 如果当前节点已访问,跳过
if current_node in visited:
continue
# 标记当前节点为已访问
visited.add(current_node)
# 遍历邻居节点
for neighbor, weight in enumerate(graph[current_node]):
if weight > 0:
# 计算起点到邻居节点的距离
distance_to_neighbor = distance + weight
# 如果计算出来的距离比当前记录的距离更短,更新距离和路径
if distance_to_neighbor < distances[neighbor]:
distances[neighbor] = distance_to_neighbor
paths[neighbor] = paths[current_node] + [current_node]
# 将邻居节点加入优先队列
heapq.heappush(pq, (distance_to_neighbor, neighbor))
# 打印输出结果
for i in range(len(graph)):
print('起点:{},终点:{},途经城市:{},最短路径长度:{}'.format(
start, i, paths[i] + [i], distances[i]
))
```
希望能对您有所帮助!
阅读全文