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]}")