λ°μν
π μμ μ λ ¬(topology sort) μ΄λ
- μμκ° μ ν΄μ Έ μλ μμ μ μ°¨λ‘λ‘ μνν΄μΌ ν λ κ·Έ μμλ₯Ό κ²°μ ν΄μ£ΌκΈ° μν΄ μ¬μ©νλ μκ³ λ¦¬μ¦
- μ΄λ€ μΌμ νλ μμλ₯Ό μ°Ύλ μκ³ λ¦¬μ¦
- λ°©ν₯ κ·Έλνμ μ‘΄μ¬νλ κ° μ μ λ€μ μ ν μμλ₯Ό μλ°°νμ§ μμΌλ©΄μ λͺ¨λ μ μ μ λμ΄νλ κ²
- μ ν μ‘°κ±΄μ΄ λ°λμ μνλμ΄μΌ λ€μμ μ§νν μ μλ€!
- μμ κ·Έλ¦Όμ 보면 μλΉν°νΈλ¦¬λ·°λμ μ§κΈ° μν΄μλ ν νλ¬μμΉ΄μ΄λΈμ μ€νκ²μ΄νΈκ° λλ€ μμ΄μΌ νλ€.
- μκ°λ³΅μ‘λ: O(V+E) | V-λ Έλμ μ, E-κ°μ μ μ
π μμ μ λ ¬(topology sort) ꡬν
- νμ μ€νμ μ¬μ©ν μ μλ€. μΌλ°μ μΌλ‘ νλ₯Ό μ¬μ©
- μ§μ μ°¨μ( νμ¬ λ Έλμ λ€μ΄μ¬ μ μλ λ Έλμ μ ) κ° 0μΈ μ μ μ νμ μ½μ (κ·Έλ¦Όμ μ¬μ΄λ²λ€ν±μ€μ½μ΄)
- νμμ μμλ₯Ό κΊΌλ΄ μ°κ²°λ κ°μ μ κ±° ( μ°κ²°λ κ°μ μ μ§μ μ°¨μλ₯Ό 1μ© λΉΌμ€λ€ )
- μ΄ ν μ§μ μ°¨μκ° 0μ΄ λλ€λ©΄ ν΄λΉ λ Έλλ₯Ό νμ μ½μ
- μ¬κΈ°μ λκ°μ§λ‘ λλλ€.
- λͺ¨λ μ μ μ μ ννκΈ°μ μ νκ° λΉμ΄μλ€λ©΄ - μΈμ΄ν΄μ΄ μ‘΄μ¬νλ€ -> μμ μ λ ¬ λΆκ°
- λͺ¨λ μ μ λ§νΌ μννλ€λ©΄ -> νμμ κΊΌλΈ μμκ° μμ μ λ ¬μ κ²°κ³Όκ° λλ€.
from collections import defaultdict
from collections import deque
V = 7
edges = [
[1, 2],
[1, 5],
[2, 3],
[3, 4],
[5, 6],
[4, 6],
[6, 7],
]
# μΈμ 리μ€νΈ
adj = defaultdict(list)
for edge in edges:
s, e = edge
adj[s].append(e)
# print(adj)
# μμ ( νμ¬ λ
Έλ λ°λ‘ μ λ
Έλκ° λͺκ° μΈμ§ ( λλ₯Ό μ§λͺ©νκ³ μλ λ
Έλμ κ°μ))
topo = [0] * (V + 1)
for key in adj:
for node in adj[key]:
topo[node] += 1
print(f'μ΅μ΄ μ§μ
μ°¨μ: {topo}')
# μ§μ
μ°¨μκ° 0μΈ μ λ€μ qμ λ£μ΄ μ€λ€.
q = deque()
for i in range(1, V + 1):
if topo[i] == 0:
q.append(i)
result = []
# μμ μ λ ¬μ΄ μμ ν μνλλ €λ©΄ μ νν Vκ°μ λ
Έλλ₯Ό λ°©λ¬Έν΄μΌ νλ€.
for _ in range(V):
if not q:
print('ERROR: μ¬μ΄ν΄ λ°μ!')
break
c = q.popleft()
result.append(c)
# c μ μ°κ²° λμ΄μλ κ°μ μ μ κ±° (= μ§μ
μ°¨μλ₯Ό 1 λΊΈλ€)
for naver in adj[c]:
topo[naver] -= 1
if topo[naver] == 0:
q.append(naver)
print(f'μμμ λ ¬ κ²°κ³Ό: {result}')
π μμ μ λ ¬(topology sort) νΉμ§
- μμ μ λ ¬μ μμ(Topological Order)κ° μ¬λ¬κ°μ§ λμ¬ μ μλ€.
- μμ μ λ ¬ μ§ν μ€ λ¨μ μλ μ μ μ€μμ μ§μ μ°¨μκ° 0μΈ μ μ μ΄ μλ€λ©΄ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ²μΌλ‘ μμμ λ ¬ μκ³ λ¦¬μ¦μ μνν μ μλ€.
- DAG(Directed Acyclic Graph) μλ§ μ μ© κ°λ₯ (μ¦, λ°©ν₯μ΄ μλ κ·Έλνμ΄κ³ , μΈμ΄ν΄μ΄ μ‘΄μ¬νλ©΄ μλλ€ )
λ°μν
'CS > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ λ ¬ μκ³ λ¦¬μ¦ λΉκ΅ (0) | 2020.10.08 |
---|---|
ν μ λ ¬(heap sort) (0) | 2020.10.06 |
νλ‘μ΄λ μμ¬(Floyd Warshall) (0) | 2020.10.04 |
μλΌν μ€ν λ€μ€μ 체(Sieve Of Eratosthenes) (0) | 2020.10.03 |
λ€μ΅μ€νΈλΌ(dijkstra) (0) | 2020.10.02 |