Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Мы можем симулировать запуск bfs сразу из нескольких вершин, если положим их всех изначально в очередь (как мы обычно делаем со стартовой), и изначально запишем в них расстояние 0. Тогда в каждой вершине до которой мы дойдем, мы запишем расстояние до нее от первой стартовой точки, из которой мы в искомую добрались. То есть, это будет кратчайшее расстояние до нее из всех стартовых. Это нам и нужно в этой задаче, для каждой вершины (бункера) найти кратчайшее расстояние до какого-нибудь выхода (расстояние от ближайшего выхода, стартовой точки в bfs). Так же будем поддерживать для каждой вершины, из какой стартовой вершины мы в нее пришли (из той же, из которой пришел наш предок)
- Пример кода на python:
- from queue import Queue
- n = int(input())
- k = int(input())
- st = sorted(list(map(int, input().split()))) #сортируем, для того чтобы они положились в очередь в порядке возрастания
- #и при одинаковом расстоянии мы пришли в вершину из того, что меньше номером
- m = int(input())
- g = [[] for i in range(n)]
- for i in range(m):
- x, y = map(int, input().split())
- x -= 1
- y -= 1
- g[x].append(y)
- g[y].append(x)
- time = [-1] * n
- bunker = [-1] * n
- q = Queue()
- for e in st:
- q.put(e - 1)
- time[e - 1] = 0
- bunker[e - 1] = e
- while not q.empty():
- h = q.get()
- for e in g[h]:
- if time[e] == -1:
- time[e] = time[h] + 1
- bunker[e] = bunker[h]
- q.put(e)
- print(*time)
- print(*bunker)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement