Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #
  2. # Complete the 'minimalCost' function below.
  3. #
  4. # The function is expected to return an INTEGER.
  5. # The function accepts following parameters:
  6. # 1. INTEGER n
  7. # 2. INTEGER start_city
  8. # 3. INTEGER end_city
  9. # 4. 2D_INTEGER_ARRAY roads
  10. # 5. 2D_INTEGER_ARRAY flights
  11. #
  12. import heapq
  13. def assert_range(x, a, b):
  14. assert a <= x and x <= b
  15.  
  16. def assert_input(n, start_city, end_city, roads, flights):
  17. N_M_K_RANGE = 1, 10**5
  18. LEN_RANGE = 1, 10**4
  19. assert_range(n , *N_M_K_RANGE)
  20. CITIES_RANGE = 1, n
  21. assert_range(len(roads) , *N_M_K_RANGE)
  22. assert_range(len(flights) , *N_M_K_RANGE)
  23. assert_range(start_city , *CITIES_RANGE)
  24. assert_range(end_city , *CITIES_RANGE)
  25. for i in range (len(roads)):
  26. assert len(roads[i]) == 3
  27. assert_range(roads[i][0] , *CITIES_RANGE)
  28. assert_range(roads[i][1] , *CITIES_RANGE)
  29. assert_range(roads[i][2] , *LEN_RANGE)
  30. for i in range (len(flights)):
  31. assert len(flights[i]) == 3
  32. assert_range(flights[i][0] , *CITIES_RANGE)
  33. assert_range(flights[i][1] , *CITIES_RANGE)
  34. assert_range(flights[i][2] , *LEN_RANGE)
  35.  
  36. def dijkstra(n, start, roads):
  37. start -= 1
  38. INF = 10**9+47
  39. g = [[] for _ in range(n)]
  40. for i in range (len(roads)):
  41. u = roads[i][0]
  42. v = roads[i][1]
  43. d = roads[i][2]
  44. u -= 1
  45. v -= 1
  46. g[v].append((u, d))
  47. g[u].append((v, d))
  48.  
  49. dist = [INF for _ in range(n)]
  50. q = []
  51. q.append((0, start))
  52. dist[start] = 0
  53. while q:
  54. d, v = heapq.heappop(q)
  55. if d > dist[v]:
  56. continue
  57. for u, w in g[v]:
  58. new_d = d + w
  59. if new_d < dist[u]:
  60. dist[u] = new_d
  61. heapq.heappush(q , (dist[u] , u))
  62. return dist
  63.  
  64. def minimalCost(n, start_city, end_city, roads, flights):
  65. assert_input(n, start_city, end_city, roads, flights)
  66. f = dijkstra(n, start_city, roads)
  67. g = dijkstra(n, end_city, flights)
  68. INF = 10**9+47
  69. ans = INF
  70. for i in range (n):
  71. print(str(f[i]) + " " + str(g[i]))
  72. if f[i] == INF or g[i] == INF:
  73. continue
  74. ans = min(ans , f[i] + g[i])
  75. if ans == INF:
  76. ans = -1
  77. return ans
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement