Advertisement
nq1s788

Untitled

Dec 22nd, 2024
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.11 KB | None | 0 0
  1. Мы можем симулировать запуск bfs сразу из нескольких вершин, если положим их всех изначально в очередь (как мы обычно делаем со стартовой), и изначально запишем в них расстояние 0. Тогда в каждой вершине до которой мы дойдем, мы запишем расстояние до нее от первой стартовой точки, из которой мы в искомую добрались. То есть, это будет кратчайшее расстояние до нее из всех стартовых. Это нам и нужно в этой задаче, для каждой вершины (бункера) найти кратчайшее расстояние до какого-нибудь выхода (расстояние от ближайшего выхода, стартовой точки в bfs). Так же будем поддерживать для каждой вершины, из какой стартовой вершины мы в нее пришли (из той же, из которой пришел наш предок)
  2.  
  3. Пример кода на python:
  4. from queue import Queue
  5. n = int(input())
  6. k = int(input())
  7. st = sorted(list(map(int, input().split()))) #сортируем, для того чтобы они положились в очередь в порядке возрастания
  8.                                             #и при одинаковом расстоянии мы пришли в вершину из того, что меньше номером
  9. m = int(input())
  10. g = [[] for i in range(n)]
  11. for i in range(m):
  12.     x, y = map(int, input().split())
  13.     x -= 1
  14.     y -= 1
  15.     g[x].append(y)
  16.     g[y].append(x)
  17. time = [-1] * n
  18. bunker = [-1] * n
  19. q = Queue()
  20. for e in st:
  21.     q.put(e - 1)
  22.     time[e - 1] = 0
  23.     bunker[e - 1] = e
  24. while not q.empty():
  25.     h = q.get()
  26.     for e in g[h]:
  27.         if time[e] == -1:
  28.             time[e] = time[h] + 1
  29.             bunker[e] = bunker[h]
  30.             q.put(e)
  31. print(*time)
  32. print(*bunker)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement