38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
INF = float('inf')
|
|
|
|
def Dijkstra(G, origin):
|
|
node_num = len(G)
|
|
vis = [False] * node_num
|
|
dis = [G[origin][node] for node in range(node_num)]
|
|
paths = [[]] * node_num
|
|
paths[origin].append(origin)
|
|
vis[origin] = True
|
|
last_point = origin
|
|
for i in range(node_num - 1):
|
|
min_dis = INF
|
|
for j in range(node_num):
|
|
if not vis[j] and dis[j] < min_dis:
|
|
min_dis = dis[j]
|
|
last_point = j
|
|
vis[last_point] = True
|
|
if i == 0:
|
|
paths[last_point] = paths[origin] + [last_point]
|
|
for k in range(node_num):
|
|
if G[last_point][k] < INF and dis[k] > dis[last_point] + G[last_point][k]:
|
|
dis[k] = dis[last_point] + G[last_point][k]
|
|
paths[k] = paths[last_point] + [k]
|
|
|
|
return dis, paths
|
|
|
|
|
|
if __name__ == '__main__':
|
|
G = [[0, 1, 12, INF, INF, INF],
|
|
[INF, 0, 9, 3, INF, INF],
|
|
[INF, INF, 0, INF, 5, INF],
|
|
[INF, INF, 4, 0, 13, 15],
|
|
[INF, INF, INF, INF, 0, 4],
|
|
[INF, INF, INF, INF, INF, 0]]
|
|
origin = 0
|
|
dis, paths = Dijkstra(G, origin)
|
|
for i in range(len(G)):
|
|
print(f"{origin} to {i}", "path:", paths[i], f"distance: {dis[i]}") |