โ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/25195
N๊ฐ์ ์ ์ ๊ณผ M๊ฐ์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง, ์ฌ์ดํด์ด ์๋ ๋ฐฉํฅ๊ทธ๋ํ(DAG)๊ฐ ์ฃผ์ด์ง๋ค.
ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด๋ ์ข ์ข ์ด ๊ทธ๋ํ ์์์ ์ฌํ์ ๋ ๋๋ค. ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด์ ์ฌํ์ 1๋ฒ ์ ์ ์์ ์ถ๋ฐํด ๊ฐ์ ์ ๋ฐ๋ผ์ ์ด๋ํ๋ค. ๊ทธ๋ฌ๋ค๊ฐ ๋ ์ด์ ๊ฐ์ ์ ๋ฐ๋ผ์ ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ ํฌ์ด๋ฆฌ์คํธ์ ์ฌํ์ ์ข ๋ฃ๋๋ค.
ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด์ ์ด์ฑ ํฌ์ธ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ ํฌ์ด๋ฆฌ์คํธ๋ฅผ ๋ง๋๊ธฐ ์ํด ๊ทธ๋ํ ์์ ์ ์ ์ผ๋ถ์์ ์ ๋ณตํ๊ณค ํ๋ค. ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๊ฐ ์ ๋ณตํ ์ ์ ์์ ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด๊ฐ ์ ์๊ฒ ๋๋ฉด ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด์ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๊ฐ ๋ง๋๊ฒ ๋๋ค.
์ค๋๋ ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด๋ ์์ ์ ๋ค์ผ๋ฉด์ ์ฌํ์ ๋ ๋๋ ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ค๊ฐ Twice์ ๋ ธ๋์ธ "YES or YES" ์์ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฌ๋ฅผ ๋ฃ๊ฒ ๋๋ค.
์กฐ๊ธ ์ฝ๊ฒ ๋งํ์๋ฉด ๋ ๋ญ ๊ณจ๋ผ๋ ๋ ๋ง๋๊ฒ ๋ ๊ฑฐ์ผ Twice, YES or YES ๊ฐ์ฌ ์ค ์ผ๋ถ |
ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด๋ Twice์ ๋ ธ๋ ๊ฐ์ฌ์ฒ๋ผ, ๋ญ ๊ณจ๋ผ๋ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ฅผ ๋ง๋๊ฒ ๋ ๊ฒ์ธ์ง ๊ถ๊ธํด์ก๋ค.
ํฌ์ด๋ฆฌ์คํธ ๊ณฐ๊ณฐ์ด๊ฐ ์ด๋ป๊ฒ ์ด๋ํ๋๋ผ๋ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ฅผ ๋ง๋๊ฒ ๋๋ค๋ฉด "Yes" ๋ฅผ, ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ฅผ ๋ง๋์ง ์๊ณ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค๋ฉด "yes" ๋ฅผ ์ถ๋ ฅํ์.
๐ค ์ ์ถ๋ ฅ ์์
๐ง ๋์ด๋/์์ ์๊ฐ
โ ๋์ด๋: solved.ac ๊ธฐ์ค G4
โ ์์ ์๊ฐ: 1์๊ฐ 5๋ถ
โ ๊ถ์ฅ ์๊ฐ: 1์๊ฐ 15๋ถ
๊ณ์ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ค๋ฅธ ๋ถ ์ฝ๋ ํด๋ก ์ฝ๋ฉํ๋ฉด์ ์ ์ถํ ๊ฑฐ๋ผ ํผ์ ํ์ผ๋ก ํผ ๊ฑด ์๋
๐ฉ๐ซ ์ฐธ๊ณ
https://subinze.tistory.com/m/400
๐ก ํ์ด
1) ๋ฌธ์ ์ ํ ํ์
์ต์ ํ์, ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์๊ฐํ ํ์ ์์ด 1๋ฒ ๋ ธ๋~๋ฆฌํ ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก๋ฅผ ํ๋์ฉ ๋ค ํ์ธํ๋ฉด์ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด์ ๋ฑ์ฅ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๊ฒ ์ค์ํ๊ฒ ๊ตฌ๋ ๋ผ๋ ์๊ฐ์ด ๋ค์ด DFS๋ฅผ ๋ ์ฌ๋ ธ๋ค.
2) ๊ตฌํ
์ค๋ ๋ฌธ์ ๋ ์ฝ๋์ ๋ฐ๋ก ์ฃผ์์ ๋ฌ์์ ์ค๋ช ์ ๋์ ํ๋ ค๊ณ ํ๋ค. ์ด๋ป๊ฒ ํ์ด์ผ ํ ์ง ๊ฐ์ ์์ ๋ชป ์ก์ ์ ๋๋ ์๋์๋๋ฐ ๊ตฌํ์ ๋ชปํด์ ์๋ ฅ์ผ๋ก ๋ชป ํ์๋ค๋ ๊ฒ ๋๋ฌด ์์ฝ๋ค.
import sys
# ์ฌ๊ท ๊น์ด ๋ ๊น๊ฒ ์ค์
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N, M = map(int, input().split())
# ๋จ๋ฐฉํฅ ๊ทธ๋ํ ์์ฑ
graph = {k: [] for k in range(1, N+1)}
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
S = int(input())
fanclub = list(map(int, input().split()))
# ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ์ฉ ๋ฐฐ์ด
visited = [False]*(N+1)
def DFS(start_node):
global flag # ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ฅผ ๋ง๋ฌ๋์ง ์ฒดํฌํ๊ธฐ ์ํ ๋ณ์(๊ธฐ๋ณธ ๊ฐ์ False)
'''
[์ข
๋ฃ ์กฐ๊ฑด 1]
ํ์ฌ ํ์ธ ์ค์ธ ๋
ธ๋๊ฐ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด ๋
ธ๋ ๋ฆฌ์คํธ์ ์ํ ๊ฒฝ์ฐ ์ข
๋ฃ
'''
if start_node in fanclub:
return
visited[start_node] = True
'''
[์ข
๋ฃ ์กฐ๊ฑด 2]
์ด์ ์ ์ข
๋ฃ๋์ง ์์๊ณ ํ์ฌ ํ์ธ ์ค์ธ ๋
ธ๋๊ฐ ๋ฆฌํ ๋
ธ๋์ผ ๊ฒฝ์ฐ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ฅผ ๋ง์ฃผ์น์ง ์๋ ๊ฒฝ๋ก๋ก ์๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ flag = True๋ก ๋ฐ๊พผ ํ ์ข
๋ฃ
'''
if graph[start_node] == []:
flag = True
return
# ์ด์ ์ ์ข
๋ฃ๋์ง ์์๋ค๋ฉด ํ์ฌ ํ์ธ ์ค์ธ ๋
ธ๋(start_node)์ ์ฐ๊ฒฐ๋ ๋
ธ๋(node) ํ์
for node in graph[start_node]:
# node๊ฐ ๋ฆฌํ ๋
ธ๋๊ฐ ์๋๋ฉด์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ผ ๋ DFS ์ํ
if graph[node] != [] and not visited[node]:
DFS(node)
# node๊ฐ ๋ฆฌํ ๋
ธ๋์ด๋ฉด์ ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด ๋
ธ๋ ๋ฆฌ์คํธ์ ์ํ์ง ์์ flag = True๋ก ๋ฐ๊พผ ํ ์ข
๋ฃ
elif graph[node] == [] and node not in fanclub:
flag = True
return
flag = False
DFS(1)
# DFS๋ฅผ ๋ค ๋์์ ๋ flag = True๋ฉด ํฌํด๋ฝ ๊ณฐ๊ณฐ์ด๋ฅผ ๋ง๋์ง ์๋ ๊ฒฝ๋ก๊ฐ ์๋ค๋ ๋ป
if flag:
print("yes")
else:
print("Yes")
4) ์ด๋ ค์ ๋ ์ /๋ฐฐ์ด ์
๐จ ์ด๋ ค์ ๋ ์
- ์ผ์ฐ ์ข ๋ฃํ๊ธฐ ์ํด ํ์ฌ ํ์ธ ์ค์ธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๊ฐ ๋ฆฌํ ๋ ธ๋์ธ์ง ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ๋ ๊ฒ ์ด๋ ค์ ๋ค. ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ฝ๋ค ๋ณด๋๊น ์~ ํ๊ฒ ๋๋ ๋ถ๋ถ์ด๋ค.
โ ๋ฐฐ์ด ์
- ๋น return๋ ์ฐ์ผ ๋๊ฐ ์๋ค.
- ์ฝ๋ ์ฐธ๊ณ ํ๋ ๋ถ ๋ธ๋ก๊ทธ๋ฅผ ๋ค์ ๋ณด๋ค ๋ณด๋ DFS์์์ return ์๋ฏธ์ ๋ํด ์ข ๋ ์ฐพ์๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
'Problem Solving > [ํญํด99] TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
99ํด๋ฝ ์ฝํ ์คํฐ๋ 13์ผ์ฐจ TIL / ๊ทธ๋ฆฌ๋ (1) | 2024.11.09 |
---|---|
99ํด๋ฝ ์ฝํ ์คํฐ๋ 12์ผ์ฐจ TIL / BFS(๋๋น ์ฐ์ ํ์) (0) | 2024.11.08 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 10์ผ์ฐจ TIL / BFS(๋๋น ์ฐ์ ํ์) (2) | 2024.11.06 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 9์ผ์ฐจ TIL / BFS(๋๋น ์ฐ์ ํ์) (0) | 2024.11.06 |
99ํด๋ฝ ์ฝํ ์คํฐ๋ 8์ผ์ฐจ TIL / DFS(๊น์ด ์ฐ์ ํ์) (0) | 2024.11.04 |