๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch13-15] ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (BFS)
โ๏ธIdea Sketch
์๊ฐ๋ณต์ก๋
๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ
๋ก ๊ตฌํํ ๊ฒฝ์ฐ O(V + E)์ด๋ค.
BFS์์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค. ํ ๋ฒ ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๋๋ค. (V = vertex = ์ ์ )
BFS์์ ํ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๊ฐ์ ์ผ๋ก ์ธ์ ํ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค. ํ ๋ฒ ์ง๋๊ฐ ๊ฐ์ ์ ๋ค์ ์ง๋๊ฐ์ง ์๋๋ค. (E = edge = ๊ฐ์ )
๋ฐ๋ผ์ ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ๊ฒฝ์ฐ, ์๊ฐ๋ณต์ก๋๋ O(V + E) ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ : BFS
๋์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ ๋ฌธ์ ์ด๋ฏ๋ก BFS ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ฉด ๋๋ค.
โ๏ธ๋ด ์์ค์ฝ๋
graph
์ธ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ bfs ํจ์๋ฅผ ์คํํ๋ค.- ๋ฐฐ์ด visited๋ ๋์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค. ์๋กญ๊ฒ ๋ฐฉ๋ฌธํ ๋์ y์ visited ๊ฐ์
์ด์ ์ ๋ฐฉ๋ฌธํ ๋์ x์ visited ๊ฐ + 1
์ด๋ค. - ๋ฐฐ์ด city๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋์์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ค. ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ k์ธ ๊ฒฝ์ฐ city ๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ , ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ k๋ณด๋ค ํด ๊ฒฝ์ฐ์๋ bfs ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
์ ์ฒด ์ฝ๋
from collections import deque
import sys
si = sys.stdin.readline
n, m, k, x = map(int, si().split())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
a, b = map(int, si().split())
graph[a].append(b)
def bfs(k, x):
queue = deque([x])
visited[x] = 0
city = []
while queue:
x = queue.popleft()
for y in graph[x]:
if visited[y] == -1:
visited[y] = visited[x] + 1
queue.append(y)
if visited[y] == k:
city.append(y)
elif visited[y] > k:
return city
return city
visited = [-1] * (n + 1)
city = bfs(k, x)
if city:
for x in sorted(city):
print(x)
else:
print(-1)