Advertisement
sweeneyde

Untitled

Dec 13th, 2020
603
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.46 KB | None | 0 0
  1. from collections import defaultdict
  2. import heapq
  3.  
  4. N, M = map(int, input().split())
  5. edges = defaultdict(dict)
  6. for i in range(M):
  7.     a, b, d = map(int, input().split())
  8.     edges[a][b] = d
  9.     edges[b][a] = d
  10.  
  11. def dijkstra(edges, initial, final):
  12.     heap = [(0, initial, None)]
  13.     final_distances = {}
  14.     successors = {}
  15.  
  16.     while True:
  17.         if not heap:
  18.             return None
  19.         if len(successors) == len(edges):
  20.             return successors
  21.         d_v, v, succ = heapq.heappop(heap)
  22.         if v in final_distances:
  23.             continue
  24.         final_distances[v] = d_v
  25.         successors[v] = succ
  26.         if v == final:
  27.             return successors
  28.  
  29.         for w, d in edges[v].items():
  30.             if w in final_distances:
  31.                 continue
  32.             heapq.heappush(
  33.                 heap,
  34.                 (
  35.                     d_v + d,
  36.                     w,
  37.                     v
  38.                 )
  39.             )
  40.  
  41. successors = dijkstra(edges, initial=1, final=None)
  42. if successors is None:
  43.     print("impossible")
  44.     quit()
  45.  
  46. for v, w in successors.items():
  47.     try:
  48.         del edges[v][w]
  49.     except KeyError:
  50.         pass
  51.  
  52. predecessors = dijkstra(edges, initial=0, final=1)
  53. if predecessors is None:
  54.     print("impossible")
  55.     quit()
  56.  
  57. node = 1
  58. path = [node]
  59. while True:
  60.     node = predecessors[node]
  61.     path.append(node)
  62.     if node == 0:
  63.         break
  64. path.reverse()
  65.  
  66. print(len(path), *path)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement