๐๋ฌธ์ ํ์ํ๊ธฐ
- N(5 ≤ N ≤ 100,000)๊ฐ์ ์ ์ ๊ณผ M(1 ≤ M ≤ 200,000)๊ฐ์ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ค.
- ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ, ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 1
- ์ ์ R์์ ์์ํ์ฌ ๋๋น ์ฐ์ ํ์์ผ๋ก ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ ๋
ธ๋์ ๋ฐฉ๋ฌธ ์์ ์ถ๋ ฅํ๊ธฐ
- ์ธ์ ์ ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธ
์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ฐ๋ผ BFS ํ์ํ๋ฉฐ ๊ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ช๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ๋์ง ์ฒดํฌํ๋ฉด ๋๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- ์ ์ ์ ์ N, ๊ฐ์ ์ ์ M, ์ฌ์ ์ ์ R์ ์ ๋ ฅ๋ฐ๋๋ค.
- ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ์ธ์ ๋ฆฌ์คํธ graph์ ์ ์ฅํ๋ค.
- graph์ ๊ฐ ์์๋ค์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- deque๋ฅผ ์ฌ์ฉํด q๋ฅผ ๋ง๋ค์ด R์ ์ ์ฅํ๋ค.
- ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ visited๋ฅผ ๋ง๋ค์ด 0์ผ๋ก ์ด๊ธฐํํ๊ณ , R๋ฒ์งธ ์์์๋ 1์ ์ ์ฅํ๋ค.
- visited_order๋ฅผ 2๋ก ์ด๊ธฐํํ๋ค.
- q๊ฐ ๋น๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- q์์ ๊ฐ์ฅ ์์ชฝ์ ์์๋ฅผ ๊บผ๋ธ๋ค.
- ๊บผ๋ธ ๋ ธ๋์ ์ธ์ ํ ์ ์ ์ ์ค๋ฆ์ฐจ์ ํ์ํ๋ค.
- ์ธ์ ํ ์ ์ ์ด ํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด, visited์ ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ธฐ๋ก ํ visited_order์ 1์ ๋ํ, q์ ๋งจ ๋ค์ ์ถ๊ฐํ๋ค.
- ํ์์ด ์ข ๋ฃ๋ ํ ๊ฐ ์ ์ ๋ค์ ๋ฐฉ๋ฌธ ์์๋ฅผ visited๋ฅผ ํ ๋๋ก ์ถ๋ ฅํ๋ค.
๐์ ๋ต ์ฝ๋
import sys
from collections import deque
input = sys.stdin.readline
N, M, R = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
for i in range(N+1):
graph[i].sort()
q = deque([R])
visited = [0]*(N+1)
visited[R] = 1
visited_order = 2
while q:
cur_node = q.popleft()
for next_node in graph[cur_node]:
if not visited[next_node]:
q.append(next_node)
visited[next_node] = visited_order
visited_order += 1
print(*visited[1:], sep="\n")
728x90