【问题描述】最短路径问题实际上是带权有向图(网)的一种应用,用Dijkstra算法求两个顶点间的最短路径。备注:输入的有向网信息中0表示不存在顶点到自身的弧,32767表示两个顶点之间不存在弧。 【输入形式】带权有向图(网)的顶点数及,有向图(网)的信息,出发顶点。 【输出形式】输出出发顶点到有向图(网)其余顶点间的最短路径长度及其路径。
时间: 2023-07-16 11:16:19 浏览: 96
以下是Python代码实现Dijkstra算法解决最短路径问题:
```python
import sys
def dijkstra(graph, start):
# 初始化距离列表和已访问顶点集合
dist = [sys.maxsize] * len(graph)
visited = set()
dist[start] = 0
# 循环遍历所有顶点
for i in range(len(graph)):
# 找到未访问的距离最小的顶点
min_dist = sys.maxsize
min_vertex = -1
for j in range(len(graph)):
if j not in visited and dist[j] < min_dist:
min_dist = dist[j]
min_vertex = j
# 将该顶点加入已访问集合,并更新其邻接顶点的距离
visited.add(min_vertex)
for k in range(len(graph)):
if graph[min_vertex][k] != 0 and k not in visited:
new_dist = dist[min_vertex] + graph[min_vertex][k]
if new_dist < dist[k]:
dist[k] = new_dist
return dist
# 测试
n = int(input("请输入顶点数:"))
graph = []
for i in range(n):
row = list(map(int, input("请输入第{}行顶点的信息:".format(i+1)).split()))
graph.append(row)
start = int(input("请输入出发顶点:"))
dist = dijkstra(graph, start)
for i in range(n):
if dist[i] == sys.maxsize:
print("从{}到{}不存在路径".format(start, i))
else:
print("从{}到{}的最短路径长度为:{}".format(start, i, dist[i]))
```
其中,输入的图信息以邻接矩阵的形式保存在二维列表`graph`中,`sys.maxsize`表示较大的距离(即无穷大)。`dijkstra(graph, start)`函数返回出发顶点到所有顶点的最短路径长度列表`dist`。输出时,若两个顶点之间不存在路径,则输出不存在路径的提示。否则,输出出发顶点到该顶点的最短路径长度。
阅读全文