以此图为例:
代码:
print("请输入顶点个数")
vertex_num = int(input())
print("请输入边的条数")
edge_num = int(input())
print("请输入源点")
start = int(input())
print("请依次输入顶点之间路径长度")
fmax = float('inf')
# 初始化邻接矩阵
graph = [[fmax for _ in range(vertex_num)] for _ in range(vertex_num)]
# 初始化源点到各个点的距离数组
dist = [fmax for _ in range(vertex_num)]
# 初始化源点到各个点的路径数组
path = [-1 for _ in range(vertex_num)]
# 用来存放已经确认最短距离的点
T = []
# 创建图
for i in range(edge_num):
path_list = input().split(" ")
graph[int(path_list[0])][int(path_list[1])] = int(path_list[2])
def dijkstra(graph, s):
for i in range(vertex_num):
# 初始化dist数组
dist[i] = graph[s][i]
# 初始化path数组
if graph[s][i] < fmax:
path[i] = s
# 初始化顶点集
T.append(s)
while len(T) != vertex_num: # 如果顶点集T没有满,就一直循环
temp_num = fmax
for vertex in range(vertex_num):
if vertex not in T: # 如果顶点没被加入到T中,表明从源点到该顶点的最短距离还没确定
if dist[vertex] < temp_num:
temp_num = dist[vertex]
min_vertex = dist.index(temp_num)
if min_vertex in T: # 判断取出的最短距离的点是不是之前已经确认了(针对有路径相同的点)
min_vertex = dist.index(temp_num, min_vertex+1) # 如果确认了,就找下一个点
# 将确认了最短路径的点,加入到顶点集
T.append(min_vertex)
# 找min_index的出度点
for i in range(vertex_num):
if graph[min_vertex][i] != fmax and i not in T:
if dist[i] > dist[min_vertex] + graph[min_vertex][i]:
dist[i] = dist[min_vertex] + graph[min_vertex][i]
path[i] = min_vertex
return dist, path
dist, path = dijkstra(graph, start)
print("源点到各个点的距离:", end=" ")
print(dist)
print("路径:", end=" ")
print(path)
输入:
请输入顶点个数
5
请输入边的条数
6
请输入源点
0
请依次输入顶点之间路径长度
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
输出:
源点到各个点的距离: [inf, 1, 2, 1, 2]
路径: [-1, 0, 0, 0, 3]