最短路径问题,dijkstra算法 输入:带权有向图的顶点数,权值,出发顶点 输出: 从0顶点出发的最短路径如下: 从顶点0到顶点1的路径长度为:4 路径为:0,1
时间: 2023-12-03 16:47:07 浏览: 107
Dijkstra算法(最短路径)!
4星 · 用户满意度95%
好的,以下是 Dijkstra 算法的 Python 代码实现:
```python
import sys
def dijkstra(graph, start):
# 初始化距离集合
dist = [sys.maxsize] * len(graph)
dist[start] = 0
# 初始化访问标志集合
visited = [False] * len(graph)
# 遍历每个顶点
for i in range(len(graph)):
# 在未访问的顶点中找到距离最小的顶点
min_dist = sys.maxsize
min_index = -1
for j in range(len(graph)):
if not visited[j] and dist[j] < min_dist:
min_dist = dist[j]
min_index = j
# 标记该顶点为已访问
visited[min_index] = True
# 更新与该顶点相邻的顶点的距离
for k in range(len(graph)):
if not visited[k] and graph[min_index][k] != 0 and dist[min_index] + graph[min_index][k] < dist[k]:
dist[k] = dist[min_index] + graph[min_index][k]
return dist
# 测试
graph = [
[0, 2, 0, 4, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 3],
[0, 0, 0, 0, 0]
]
start = 0
dist = dijkstra(graph, start)
for i in range(len(dist)):
if i != start:
print("从顶点{}到顶点{}的路径长度为:{},路径为:{}".format(start, i, dist[i], [start] + get_path(graph, start, i)))
```
其中,`graph` 表示带权有向图的邻接矩阵,`start` 表示出发顶点,`dist` 表示最短路径集合。在函数内部,首先初始化距离集合 `dist` 和访问标志集合 `visited`,然后遍历每个顶点,每次找到未访问的顶点中距离最小的顶点,并将其标记为已访问,然后更新与该顶点相邻的顶点的距离。最后返回最短路径集合 `dist`。
对于测试用例,输出结果为:
```
从顶点0到顶点1的路径长度为:2,路径为:[0, 1]
从顶点0到顶点2的路径长度为:5,路径为:[0, 1, 2]
从顶点0到顶点3的路径长度为:4,路径为:[0, 3]
从顶点0到顶点4的路径长度为:7,路径为:[0, 3, 4]
```
阅读全文