π Topological Sort
μΆμ² : https://www.acmicpc.net/problem/2252
β μμ μ λ ¬
- μμκ° μ ν΄μ Έ μλ μμ μ μνν΄μΌ ν λ κ·Έ μμλ₯Ό κ²°μ νκΈ° μν΄ μ¬μ©νλ μκ³ λ¦¬μ¦
- μ¬μ΄ν΄μ΄ μλ λ°©ν₯ κ·Έλνμ λͺ¨λ λ Έλλ₯Ό μμλλ‘ λμ΄ν κ²
π§ Directed Acyclic Graph (DAG)
μ¬μ΄ν΄μ΄ μλ λ°©ν₯ κ·Έλνλ‘, DAGλ μ΄λ²€νΈ κ°μ μ°μ μμλ₯Ό λνλ΄κΈ° μν΄ μ£Όλ‘ μ¬μ©νλ€.
π‘ νμ΄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
inDegree = [0] * (n + 1)
graph = [[] for _ in range(n + 1)]
result = []
for _ in range(m):
a, b = map(int, input().split())
inDegree[b] += 1
graph[a].append(b)
queue = deque()
for i in range(1, n + 1):
if inDegree[i] == 0:
queue.append(i)
while queue:
x = queue.popleft()
result.append(x)
for i in graph[x]:
inDegree[i] -= 1
if inDegree[i] == 0:
queue.append(i)
print(*result)
π ν΄μ€
κ° λ Έλμ μ§μ μ°¨μλ₯Ό ꡬνλ€.
- κ° λ Έλμ μ§μ μ°¨μλ ν΄λΉ λ Έλλ‘ λ€μ΄μ€λ κ°μ μ μ λ₯Ό μλ―Ένλ€.
- e.g. a -> b κ°μ μ΄ μ‘΄μ¬νλ©΄ 리μ€νΈ inDegreeμ b μμμ κ°μ μ¦κ°μν¨λ€.
μ§μ μ°¨μκ° 0μΈ λ Έλλ₯Ό λ±μ μ½μ νλ€.
- BFS μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μμλλ‘ νμνκΈ° μν΄ μμμ μ μ νλ κ³Όμ μ΄λΌκ³ μκ°νλ©΄ λλ€.
μλμ κ³Όμ μ ν΅ν΄ λ±μμ λμ€λ μμλλ‘ λ Έλλ€μ΄ μ λ ¬λλ€.
1
2
3
4
1. λ±μ μΌμͺ½μ μλ λ
Έλλ₯Ό μμλλ‘ κΊΌλΈλ€.
2. λ±μμ κΊΌλΈ λ
Έλμμ λ€λ₯Έ λ
Έλλ‘ ν₯νλ κ°μ μ΄ μλ€λ©΄, λ€λ₯Έ λ
Έλμ μ§μ
μ°¨μλ₯Ό κ°μμν¨λ€.
3. λ€λ₯Έ λ
Έλμ μ§μ
μ°¨μκ° 0μ΄ λμλ€λ©΄, λ±μ μ½μ
νλ€.
4. μμ κ³Όμ μ λ°λ³΅νλ€.