import heapq
import math
def path_print(source, destination, parent):
if parent[destination] == destination:
print(destination, end = " ")
else:
path_print(source, parent[destination], parent)
print(destination, end = " ")
def dijkstra(graph, source):
v = len(graph)
d = [math.inf] * v
p = [None] * v
fop = [0] * v
min_heap = []
d[source] = 0
p[source] = source
heapq.heappush(min_heap, (d[source], source))
while len(min_heap) > 0:
data = heapq.heappop(min_heap)
current_node = data[1]
if fop[current_node] == 1:
continue
fop[current_node] = 1
for neighbor, cost in graph[current_node]:
if fop[neighbor] == 1:
continue
if d[neighbor] > d[current_node] + cost:
d[neighbor] = d[current_node] + cost
p[neighbor] = current_node
heapq.heappush(min_heap, (d[neighbor], neighbor))
print(d)
path_print(0, 3, p)
graph = {
0: [(1, 2), (2, 7)],
1: [(2, 3), (3, 17)],
2: [(3, 5)],
3: []
}
dijkstra(graph, 0)
aW1wb3J0IGhlYXBxCmltcG9ydCBtYXRoCgoKZGVmIHBhdGhfcHJpbnQoc291cmNlLCBkZXN0aW5hdGlvbiwgcGFyZW50KToKICAgIGlmIHBhcmVudFtkZXN0aW5hdGlvbl0gPT0gZGVzdGluYXRpb246CiAgICAgICAgcHJpbnQoZGVzdGluYXRpb24sIGVuZCA9ICIgIikKICAgIGVsc2U6CiAgICAgICAgcGF0aF9wcmludChzb3VyY2UsIHBhcmVudFtkZXN0aW5hdGlvbl0sIHBhcmVudCkKICAgICAgICBwcmludChkZXN0aW5hdGlvbiwgZW5kID0gIiAiKQogICAgICAgICAgICAgICAgICAKCmRlZiBkaWprc3RyYShncmFwaCwgc291cmNlKToKICAgIHYgPSBsZW4oZ3JhcGgpCiAgICBkID0gW21hdGguaW5mXSAqIHYKICAgIHAgPSBbTm9uZV0gKiB2CiAgICBmb3AgPSBbMF0gKiB2CiAgICAKICAgIG1pbl9oZWFwID0gW10KICAgIAogICAgZFtzb3VyY2VdID0gMAogICAgcFtzb3VyY2VdID0gc291cmNlCiAgICAKICAgIGhlYXBxLmhlYXBwdXNoKG1pbl9oZWFwLCAoZFtzb3VyY2VdLCBzb3VyY2UpKQogICAgCiAgICB3aGlsZSBsZW4obWluX2hlYXApID4gMDoKICAgICAgICBkYXRhID0gaGVhcHEuaGVhcHBvcChtaW5faGVhcCkKICAgICAgICBjdXJyZW50X25vZGUgPSBkYXRhWzFdCiAgICAgICAgCiAgICAgICAgaWYgZm9wW2N1cnJlbnRfbm9kZV0gPT0gMToKICAgICAgICAgICAgY29udGludWUKICAgICAgICAKICAgICAgICBmb3BbY3VycmVudF9ub2RlXSA9IDEKICAgICAgICAKICAgICAgICAKICAgICAgICBmb3IgbmVpZ2hib3IsIGNvc3QgaW4gZ3JhcGhbY3VycmVudF9ub2RlXToKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIGZvcFtuZWlnaGJvcl0gPT0gMToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBkW25laWdoYm9yXSA+IGRbY3VycmVudF9ub2RlXSArIGNvc3Q6CiAgICAgICAgICAgICAgICBkW25laWdoYm9yXSA9IGRbY3VycmVudF9ub2RlXSArIGNvc3QKICAgICAgICAgICAgICAgIHBbbmVpZ2hib3JdID0gY3VycmVudF9ub2RlCiAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChtaW5faGVhcCwgKGRbbmVpZ2hib3JdLCBuZWlnaGJvcikpCiAgICAKCiAgICBwcmludChkKQogICAgCiAgICBwYXRoX3ByaW50KDAsIDMsIHApCgpncmFwaCA9IHsKICAgIDA6IFsoMSwgMiksICgyLCA3KV0sCiAgICAxOiBbKDIsIDMpLCAoMywgMTcpXSwKICAgIDI6IFsoMywgNSldLAogICAgMzogW10KICAgIH0KZGlqa3N0cmEoZ3JhcGgsIDApCgoKCgo=