Home [BOJ] μœ„μƒ μ •λ ¬ Basic
Post
Cancel

[BOJ] μœ„μƒ μ •λ ¬ Basic

πŸ“š 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. μœ„μ˜ 과정을 λ°˜λ³΅ν•œλ‹€.


This post is licensed under CC BY 4.0 by the author.

[BOJ] 졜μž₯ 곡톡 λΆ€λΆ„ μˆ˜μ—΄

[BOJ] μœ„μƒ μ •λ ¬ πŸ₯‡3