Algorithm/๋ฐฑ์ค(BOJ)
[๋ฐฑ์ค (BOJ) / Python] 18352๋ฒ: ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
meeeeejin
2021. 3. 30. 17:24
๋ฌธ์ ๋งํฌ: www.acmicpc.net/problem/18352
18352๋ฒ: ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ ๊ฐ
www.acmicpc.net
๋ฌธ์ ์ค๋ช
- BFS๋ฅผ ์ด์ฉํ์ฌ ๋์๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ์๋ค.
- BFS๋ฅผ ํ๋ ์ค ๋ง์ฝ ํ์ฌ ๋์์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐ์ด k ๋ณด๋ค ํด ๊ฒฝ์ฐ, ์ด ๋ค์ ๋ฐฉ๋ฌธํ๋ ๋์๋ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ k๋ณด๋ค ํฌ๋ฏ๋ก BFS๋ฅผ ์ค์งํ๋ค.
solution ํจ์ ์ค๋ช
- ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ k์ธ ๋์๋ค์ ๋ด์ ๋ฆฌ์คํธ answer ์ด๊ธฐํ
- ์ถ๋ฐ ๋์๋ฅผ ํ์ ์ฝ์ ํ๊ณ , ์ถ๋ฐ ๋์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ฒ๋ฆฌ
- ํ์์ ์์๋ฅผ ํ๋ ๊บผ๋ด๊ณ ๋ง์ฝ ํด๋น ์์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ k๋ผ๋ฉด answer์ ์ฝ์
- ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํด๋น ์์์ ์ธ์ ํ ๋์๋ค์ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
- 3~4๋ฅผ ํ์ฌ ๋ฐฉ๋ฌธ ๋์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ k ์ดํ์ผ ๋ ๋ฐ๋ณต
์์ค์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
INF = int(1e9)
# ๋์ ๊ฐ์, ๋๋ก ๊ฐ์, ์ต๋จ ๊ฑฐ๋ฆฌ, ์ถ๋ฐ ๋์
n, m, k, x = map(int, input().split())
# ๊ฐ ๋์์ ์ฐ๊ฒฐ๋ ๋๋ก ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ
graph = [[] for i in range(n + 1)]
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ
distance = [INF] * (n + 1)
# ๋ชจ๋ ๋๋ก ์ ๋ณด ์
๋ ฅ ๋ฐ๊ธฐ
for _ in range(m):
i, j = map(int, input().split())
graph[i].append(j) # ๋์ i์์ ๋์ j๊น์ง ๋๋ก๊ฐ ์กด์ฌ
def solution(start):
answer = []
queue = deque([start])
distance[start] = 0
# bfs ๋ฐฉ์์ผ๋ก ์ธ์ ๋์๋ค ๋ฐฉ๋ฌธ
while queue:
v = queue.popleft()
if distance[v] == k:
answer.append(v)
if distance[v] > k: # ๋๋จธ์ง ๋์๋ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ k ์ด์
return answer
for x in graph[v]:
# ํ์ฌ ๋์ v๋ฅผ ๊ฑฐ์ณ์ ๋์ x๊น์ง ๊ฐ๋๊ฒ ๋ ์งง์ ๊ฒฝ์ฐ
if distance[v] + 1 < distance[x]:
distance[x] = distance[v] + 1
queue.append(x)
return answer
answer = solution(x)
if answer:
answer.sort()
for x in answer: print(x)
else:
print(-1)
728x90