๐๋ฌธ์ ํ์ํ๊ธฐ
- ์ด๋ค ๋๋ผ์ 1๋ฒ๋ถํฐ N(2 ≤ N ≤ 300,000)๋ฒ๊น์ง์ ๋์์ M(1 ≤ M ≤ 1,000,000)๊ฐ์ ๋จ๋ฐฉํฅ ๋๋ก๊ฐ ์กด์ฌ
- ๋ชจ๋ ๋๋ก์ ๊ฑฐ๋ฆฌ๋ 1
- ํน์ ํ ๋์ X๋ก๋ถํฐ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋ชจ๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ํํ K(1 ≤ K ≤ 300,000)์ธ ๋ชจ๋ ๋์๋ค์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๊ธฐ
- ์ถ๋ฐ ๋์ X์์ ์ถ๋ฐ ๋์ X๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ 0์ด๋ผ๊ณ ๊ฐ์
์ด ๋ฌธ์ ์์๋ ๊ฐ ๋์๋ฅผ ์ ์ , ๊ฐ ๋์์ ์ฐ๊ฒฐ๋ ๋จ๋ฐฉํฅ ๋๋ก๋ฅผ ๊ฐ์ ์ผ๋ก ์๊ฐํ๋ฉด ๋๋ผ์ ๋๋ก ์ ๋ณด๋ฅผ ๊ทธ๋ํ๋ก ํํํ ์ ์๋ค. ์ฆ, ์ถ๋ฐ ๋์ X์์ ๊ทธ๋ํ ํ์์ ํตํด ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋์๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์๊ณ , ๊ทธ ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ํํ K์ธ ๋์์ธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์๋ผ ์ ์๋ค.
X์์ ๋ค๋ฅธ ๋์๋ค๊น์ง ๋๋น ์ฐ์ ํ์(BFS)์ ์ํํ๋ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ O(N+M)์ผ๋ก ์๊ฐ ๋ด์ ํ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X ์ ๋ ฅ ๋ฐ๊ธฐ
- ๋จ๋ฐฉํฅ ๋๋ก ์ ๋ณด๋ฅผ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ roads ์์ฑํ๊ธฐ
- M๊ฐ์ ๋๋ก ์ ๋ณด(์ถ๋ฐ์ง A, ๋์ฐฉ์ง B)๋ฅผ ์ ๋ ฅ๋ฐ์ roads ๊ฐฑ์ ํ๊ธฐ
- X๋ถํฐ ๊ฐ ๋์๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ ๋ฆฌ์คํธ distances ์์ฑํ๊ธฐ
- X๋ถํฐ ์์ํด์ BFS ํ์ ์ํํ๋ฉฐ distances ๊ฐฑ์ ํ๊ธฐ (๋ฐฉ๋ฌธ์ฌ๋ถ๋ distances ์์๋ก ํ๋ณ)
- ํ์ฌ ๊ฑฐ๋ฆฌ๊ฐ ์ด๋ฏธ K์ธ ๋์ ์ดํ๋ถํฐ๋ ํ์์ ํ์ง ์๊ธฐ ์ํด ํ์ ์ถ๊ฐํ์ง ์๋๋ค.
- distances๊ฐ K์ธ ๋์๋ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๊ธฐ
๐์ ๋ต ์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
N, M, K, X = map(int, input().split())
roads = [[] for _ in range(N)]
for _ in range(M):
A, B = map(lambda x: int(x)-1, input().split())
roads[A].append(B)
distances = [-1]*N
q = deque([X-1])
distances[X-1] = 0
has_city_at_K = False
while q:
cur_city = q.popleft()
for next_city in roads[cur_city]:
if distances[next_city] == -1:
distances[next_city] = distances[cur_city] + 1
if distances[next_city] < K:
q.append(next_city)
if distances[next_city] == K:
has_city_at_K = True
if has_city_at_K:
for i in range(N):
if distances[i] == K:
print(i+1)
else:
print(-1)
728x90