https://www.acmicpc.net/problem/1260
1260๋ฒ: DFS์ BFS
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
dfs๋ ๊น์ด ์ฐ์ ํ์, ์ฆ ๋ง ๊ทธ๋๋ก ๊น์ด๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ํด์ฃผ๋ ๊ฒ์ด๊ณ ,
bfs๋ ๋๋น ์ฐ์ ํ์, ์ฆ ๋๋น๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์ํด์ฃผ๋ ๊ฒ์ด๋ค.
๋ฌธ์ ์์ฒด๋ bfs์๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ฒ์ด๋์ง ์์ ์ฝ๊ฒ ํ ์ ์์ง๋ง ์ฃผ์ํด์ผํ ์ ์ dfs์ bfs๋ฅผ ๊ฐ์ ์คํํด์ผํ๋ฏ๋ก visited ๋ฅผ ์ด๊ธฐํ ํด์ฃผ๊ฑฐ๋, ๋๊ฐ ๋ง๋ค๊ฑฐ๋, dfs๋ visited๋ฅผ True bfs ๋ False๋ก ํด์ฃผ๋ ๋ฑ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผํ๋ค.
DFS์ BFS๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ์๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ํ์ ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ํด๋น ๋ฌธ์ ์์ Class Node๋ฅผ ํ๋ฉด์ Node๋ฅผ ๋ง๋ค๊ณ ์ฐ๊ฒฐํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ผ๋ก ํ๊ณผ ์ด์ ํตํด์ ๊ฐ์ ํด๋น ์ซ์๋ค์ด ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์งํํ๋ค.
N๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฏ๋ก N+1 x N+1์ ํ๋ ฌ์ ๋ฆฌ์คํธ๋ฅผ ํตํด์ ๋ง๋ค๊ณ 0์ผ๋ก ์ฑ์์ค๋ค. ์ธ๋ฑ์ค์ ๊ฐ์ ์ผ์น์ํค๊ธฐ ์ํด์ N+1๊ฐ์ ์ซ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฐ๊ฒฐ๋ ์ซ์๋ค ๊ฐ์ ์ ๋ ฅ๋ฐ์์ ํด๋น ํ๊ณผ ์ด์ ๊ฐ์ 1๋ก ๋ฐ๊ฟ์ค๋ค. ์ด๋ฅผ ํตํด์ ํ์ ์ซ์์ ์ด์ ์ซ์๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ํ์๋ฅผ ํด์ค๋ค.
ํ์ด
- ๋จผ์ ์ ๋ ฅ ๋ณ์๋ก n,m,v๋ฅผ ์ ๋ ฅ ๋ฐ๋๋ค
- ์ธ์ ์ํ๋ ฌ์ ์์ฑ์์ผ์ค๋ค. (=graph)
- ๋ฐฉ๋ฌธํ ๊ณณ์ ์ฒดํฌํ visited ๋ฆฌ์คํธ๋ฅผ DFS, BFS๋ก ๋๋์ด 2๊ฐ๋ฅผ ๋ง๋ค์ด์ค๋ค.
- ์ ๋ ฅ ๋ฐ๋ ๋ ๊ฐ์ ๋ํด ์ํ๋ ฌ์ 1์ ์ฝ์ ํ๋ค.
- DFS๋ฅผ ๊ตฌํํ ๋, ์ ์ V์ ๋ํ visited ๊ฐ์ 1์ ๋ฃ์ด ๋ฐฉ๋ฌธ์ ํ์ํ๊ณ ๊ทธํ, ์ถ๋ ฅํ๋ค.
- DFS) for ๋ฌธ์ ๋ฒ์๊ฐ 1๋ถํฐ n+1๊น์ง ๋๋ฉด์ visited ๋ฏธ๋ฐฉ๋ฌธ & graph์ ๋ํ v,i๊ฐ 1์ผ๋๋ง dfs๋ฅผ ์ฌ๊ท์คํ
- BFS๋ฅผ ๊ตฌํํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก visited ๊ฐ์ 1์ ๋ฃ์ด ๋ฐฉ๋ฌธ์ ํ์ํ๊ณ queue์ ๊ฐ์ ๋ฃ์ผ๋ฉด์ ์ถ๋ ฅํ๋ค.
- BFS) for์ ๋๋ฉด์ ๋๊ฐ์ด visited ๋ฏธ๋ฐฉ๋ฌธ & graph์ ๋ํ v,i๊ฐ 1์ผ ๋ queue์ ์ฝ์ ์ ์งํํ๊ณ ๋ฐฉ๋ฌธ์ ํ์ํ๋ค.
์ฝ๋
import sys
from collections import deque
def dfs(v):
visited_dfs[v] = 1
print(v, end = " ")
for i in range(1, n+1):
if visited_dfs[i] == 0 and graph[v][i] == 1:
dfs(i)
def bfs(v):
q = deque()
q.append(v)
visited_bfs[v] = 1
while q:
v = q.popleft()
print(v, end=" ")
for i in range(1, n+1):
if visited_bfs[i] == 0 and graph[v][i] == 1:
q.append(i)
visited_bfs[i] = 1
read = sys.stdin.readline
n, m, v = map(int, read().split())
graph = [[0] * (n+1) for i in range(n+1)]
visited_bfs = [0] * (n+1)
visited_dfs = [0] * (n+1)
for _ in range(m):
a, b = map(int, read().split())
graph[a][b] = graph[b][a] = 1
dfs(v)
print()
bfs(v)