โ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/24479
์ค๋๋ ์์ค์ด๋ ๊น์ด ์ฐ์ ํ์(DFS) ์์ ์กฐ๊ต๋ฅผ ํ๊ณ ์๋ค. ์๋น ๊ฐ ์์ ํ ๋ด์ฉ์ ํ์๋ค์ด ์ ์ดํดํ๋์ง ๋ฌธ์ ๋ฅผ ํตํด์ ํ์ธํด๋ณด์.
N๊ฐ์ ์ ์ ๊ณผ M๊ฐ์ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(undirected graph)๊ฐ ์ฃผ์ด์ง๋ค. ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ์ด๊ณ ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 1์ด๋ค. ์ ์ R์์ ์์ํ์ฌ ๊น์ด ์ฐ์ ํ์์ผ๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ ๋ ธ๋์ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํ์.
๊น์ด ์ฐ์ ํ์ ์์ฌ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ธ์ ์ ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค.
๐ค ์ ์ถ๋ ฅ ์์
๐ง ๋์ด๋/์์ ์๊ฐ
โ ๋์ด๋: solved.ac ๊ธฐ์ค S2
โ ์์ ์๊ฐ: 30๋ถ
โ ๊ถ์ฅ ์๊ฐ: 45๋ถ
S2๋ผ๊ณ ํ๊ธฐ๋ ๊ฒ ์น๊ณ ๋ ์กฐ๊ธ ์ฌ์ด ๊ฒ ๊ฐ๊ธด ํ๋ฐ ์คํฐ๋ ์์ํ๊ณ ์ฒ์์ผ๋ก ๊ถ์ฅ ์๊ฐ ์์ ํผ ๋ฌธ์ ๋ค ๋ฟ-๋ฏ
๐ก ํ์ด
1) ๋ฌธ์ ์ ํ ํ์
์ ๋ชฉ์์ ์ ์ ์๋ฏ์ด ์์ฌ ์ฝ๋๋ฅผ ๋ณด๊ณ DFS ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๋ฌธ์ ์ด๋ค. ๋ฐฉ๋ฌธ ์์ ์ฒ๋ฆฌ ๋ง๊ณ ๋ค๋ฅธ ๋ถ๋ถ์ ์์ฌ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค.
2) ์์ด๋์ด ํ๋ฆ
โ DFS ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ ํ ๊ตฌ์ฑ
์์ฌ ์ฝ๋์ ์ ํ๋๋ก ํ์ฌ ์ ์ ์ธ R์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํด์ค ํ R๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉด์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๊ฐ ๋์ด ์์ง ์์ ๋ ธ๋๋ฅผ ์ด์ฉํด ๊น๊ฒ ๋ค์ด๊ฐ๋ฉฐ ํ์ํ๋ค.
๋ฌธ์ ์์ '์ธ์ ์ ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค'๊ณ ํ๊ธฐ ๋๋ฌธ์ sorted ๋ฉ์๋๋ฅผ ์ ์ฉํด์ฃผ๊ณ ํ์์ ์งํํ๋ค.
โก โญํต์ฌ - ๋ฐฉ๋ฌธ ์์ ๊ธฐ๋กโญ
์ฒ์์๋ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ์ ์ฝ๊ณ ๊ทธ๋ฅ ๋ฐฉ๋ฌธ ์์๋๋ก ๋ ธ๋ ๊ทธ ์์ฒด๋ฅผ ์ถ๋ ฅํ๋์ง ์์๋ค. ๋ฌธ์ ๋ฅผ ๊ผผ๊ผผํ ์ฝ์ ใ ใ ใ rz . . โ
์ฒซ ๋ฒ์งธ ์ ์ ์ ๋ฐฉ๋ฌธ ์์๋ ๋ฌด์กฐ๊ฑด 1์ด๋ผ๊ณ ํ๊ธฐ ๋๋ฌธ์ ์์ ๊ธฐ๋ก์ฉ ๋ณ์์ ์ด๊ธฐ๊ฐ์ 1๋ก ์ค์ ํ๋ค. ์์ ๊ธฐ๋ก์ฉ ๋ณ์ ๊ฐ์ vistied ๋ฐฐ์ด์ R๋ฒ์งธ์ ์ ์ฅํด์ฃผ๊ณ , ๊ฐ์ ๊ณ์ 1์ฉ ์ฆ๊ฐ์์ผ ๋๊ฐ๋ค.
3-1) ๊ตฌํ: ์คํจ ์ฝ๋
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N, M, R = map(int, input().split())
visited = [False]*(N+1)
graph = {k: [] for k in range(1, N+1)}
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
def DFS(V, E, R):
visited[R] = True
print(R)
for node in sorted(graph[R]):
if not visited[node]:
DFS(V, E, node)
return 0
print(DFS(N, M, R))
์ด๊ฒ ์ง์ ์ ๊ณต์์ ์ฝ๋? ๋ง์ง๋ง์ DFS(N, M, R)์ print๋ฌธ์ผ๋ก ๊ฐ์ธ ๋๊ณ ์ ๋๋ ๋ None์ด ๋์ค์ง? ์ด๋ฌ๊ณ ์์๋ค. ๊ทธ๋์ 0 ๋์ค๊ฒ ํ๋ ค๊ณ return ์ถ๊ฐํด๋๊ฑด๋ฐ ๋ฐ๋ก ์ ์ ์ฐจ๋ ค์ ๋คํ์ด๋ค.
3-2) ๊ตฌํ: ์ ๋ต ์ฝ๋
import sys
sys.setrecursionlimit(10**6) # RecursionError ๋ฐฉ์ง
input = sys.stdin.readline
N, M, R = map(int, input().split())
visited = [0]*(N+1)
graph = {k: [] for k in range(1, N+1)}
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
visit_order = 1
def DFS(V, E, R):
global visit_order
visited[R] = visit_order
visit_order += 1
for node in sorted(graph[R]):
if visited[node] == 0:
DFS(V, E, node)
DFS(N, M, R)
for v in visited[1:]:
print(v)
์คํจ ์ฝ๋์์ ๋ฌธ์ ์๋ ๋ถ๋ถ์ ํ์ ํ ํ ์์ ํ๋๊น ๋ฐ๋ก ํต๊ณผํ๋ค.
4) ์ด๋ ค์ ๋ ์ /๋ฐฐ์ด ์
๐จ ์ด๋ ค์ ๋ ์
- ์์. ๋ฌธ์ ๋ง ์ข ๋๋ฐ๋ก ์ฝ์
โ ๋ฐฐ์ด ์
- ์ฌ๊ท๋ฅผ ์ฐ๋ ๋ฌธ์ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ print๋ฌธ ์์น ์ ์ ์ด ์ค์ํ๋ค๋ ๊ฒ
'Problem Solving > [ํญํด99] TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
99ํด๋ฝ ์ฝํ ์คํฐ๋ 6์ผ์ฐจ TIL / ์ด๋ถ ํ์ (0) | 2024.11.03 |
---|---|
99ํด๋ฝ ์ฝํ ์คํฐ๋ 5์ผ์ฐจ TIL / BFS(๋๋น ์ฐ์ ํ์) (0) | 2024.11.02 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 3์ผ์ฐจ TIL / ์ด๋ถ ํ์ (0) | 2024.10.30 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 2์ผ์ฐจ TIL / ์ด๋ถ ํ์ (0) | 2024.10.29 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 1์ผ์ฐจ TIL / ์ด๋ถ ํ์ (0) | 2024.10.28 |