from queue import PriorityQueue
import math
def print_path(parent, destination):
if parent[destination] == destination:
print(destination, end = " ")
else:
print_path(parent, parent[destination])
print(destination, end = " ")
def dijkstra(graph, source, V):
distance = [math.inf]*V
parent = [-1] * V
found_optimal = [0] * V
pq = PriorityQueue()
distance[source] = 0
pq.put((distance[source], source))
parent[source] = source
while not pq.empty():
current_node = pq.get()[1]
if found_optimal[current_node] == 1:
continue
found_optimal[current_node] = 1
for neighbor, cost in graph[current_node]:
if found_optimal[neighbor] != 1:
if distance[neighbor] > distance[current_node] + cost:
distance[neighbor] = distance[current_node] + cost
pq.put((distance[neighbor], neighbor))
parent[neighbor] = current_node
for i in range(V):
print_path(parent, i)
print()
graph = {
0 : [(1, 5), (2, 4)],
1 : [(2, 2), (3, 10)],
2 : [(3, 7)],
3 : []
}
V = 4
source = 0
dijkstra(graph, source, V)
ZnJvbSBxdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZQppbXBvcnQgbWF0aAoKZGVmIHByaW50X3BhdGgocGFyZW50LCBkZXN0aW5hdGlvbik6CiAgICBpZiBwYXJlbnRbZGVzdGluYXRpb25dID09IGRlc3RpbmF0aW9uOgogICAgICAgIHByaW50KGRlc3RpbmF0aW9uLCBlbmQgPSAiICIpCiAgICBlbHNlOgogICAgICAgIHByaW50X3BhdGgocGFyZW50LCBwYXJlbnRbZGVzdGluYXRpb25dKQogICAgICAgIHByaW50KGRlc3RpbmF0aW9uLCBlbmQgPSAiICIpCgpkZWYgZGlqa3N0cmEoZ3JhcGgsIHNvdXJjZSwgVik6CiAgICBkaXN0YW5jZSA9IFttYXRoLmluZl0qVgogICAgcGFyZW50ID0gWy0xXSAqIFYKICAgIGZvdW5kX29wdGltYWwgPSBbMF0gKiBWCiAgICAKICAgIHBxID0gUHJpb3JpdHlRdWV1ZSgpCiAgICAKICAgIGRpc3RhbmNlW3NvdXJjZV0gPSAwCiAgICBwcS5wdXQoKGRpc3RhbmNlW3NvdXJjZV0sIHNvdXJjZSkpCiAgICBwYXJlbnRbc291cmNlXSA9IHNvdXJjZQogICAgCiAgICB3aGlsZSBub3QgcHEuZW1wdHkoKToKICAgICAgICBjdXJyZW50X25vZGUgPSBwcS5nZXQoKVsxXQogICAgICAgIGlmIGZvdW5kX29wdGltYWxbY3VycmVudF9ub2RlXSA9PSAxOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGZvdW5kX29wdGltYWxbY3VycmVudF9ub2RlXSA9IDEKICAgICAgICAKICAgICAgICBmb3IgbmVpZ2hib3IsIGNvc3QgaW4gZ3JhcGhbY3VycmVudF9ub2RlXToKICAgICAgICAgICAgaWYgZm91bmRfb3B0aW1hbFtuZWlnaGJvcl0gIT0gMToKICAgICAgICAgICAgICAgIGlmIGRpc3RhbmNlW25laWdoYm9yXSA+IGRpc3RhbmNlW2N1cnJlbnRfbm9kZV0gKyBjb3N0OgogICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlW25laWdoYm9yXSA9IGRpc3RhbmNlW2N1cnJlbnRfbm9kZV0gKyBjb3N0CiAgICAgICAgICAgICAgICAgICAgcHEucHV0KChkaXN0YW5jZVtuZWlnaGJvcl0sIG5laWdoYm9yKSkKICAgICAgICAgICAgICAgICAgICBwYXJlbnRbbmVpZ2hib3JdID0gY3VycmVudF9ub2RlCiAgICAKICAgIGZvciBpIGluIHJhbmdlKFYpOgogICAgICAgIHByaW50X3BhdGgocGFyZW50LCBpKQogICAgICAgIHByaW50KCkKICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAKCmdyYXBoID0gewogICAgMCA6IFsoMSwgNSksICgyLCA0KV0sCiAgICAxIDogWygyLCAyKSwgKDMsIDEwKV0sCiAgICAyIDogWygzLCA3KV0sCiAgICAzIDogW10KICAgIH0KClYgPSA0Cgpzb3VyY2UgPSAwCgpkaWprc3RyYShncmFwaCwgc291cmNlLCBWKQoKCgoKCgoKCg==