π©π»βπ»λ¬Έμ μ€λͺ
[μ΄μ½ν
Ch10-4] 컀리νλΌ (Graph)
λλΉμ΄λ μ¨λΌμΈμΌλ‘ μ»΄ν¨ν° 곡ν κ°μλ₯Ό λ£κ³ μλ€. μ΄ λ κ° μ¨λΌμΈ κ°μλ μ μ κ°μκ° μμ μ μλλ°, μ μ κ°μκ° μλ κ°μλ μ μ κ°μλ₯Ό λ¨Όμ λ€μ΄μΌλ§ ν΄λΉ κ°μλ₯Ό λ€μ μ μλ€. λλΉμ΄λ μ΄ Nκ°μ κ°μλ₯Ό λ£κ³ μ νλ€. κ°μλ 1λ²λΆν° Nλ²κΉμ§μ λ²νΈλ₯Ό κ°μ§λ€. λν λμμ μ¬λ¬ κ°μ κ°μλ₯Ό λ€μ μ μλ€κ³ κ°μ νλ€. μλ₯Ό λ€μ΄, N = 3μΌ λ, 3λ² κ°μμ μ μ κ°μλ‘ 1λ²κ³Ό 2λ² κ°μκ° μ΄μ¨κ³ , 1λ²κ³Ό 2λ² κ°μλ μ μ κ°μκ° μλ€κ³ νμ. κ·Έλ¦¬κ³ κ° κ°μμ λνμ¬ κ°μ μκ°μ΄ λ€μκ³Ό κ°λ€κ³ νμ.
1λ² κ°μ: 30μκ°
2λ² κ°μ: 20μκ°
3λ² κ°μ: 40μκ°
μ΄ κ²½μ°, 1λ² κ°μλ₯Ό μκ°νκΈ°κΉμ§μ μ΅μ μκ°μ 30μκ°, 2λ² κ°μλ₯Ό μκ°νκΈ°κΉμ§λ μ΅μ 20μκ°, 3λ² κ°μλ₯Ό μκ°νκΈ°κΉμ§λ μ΅μ 70μκ°μ΄ νμνλ€. λλΉμ΄κ° λ£κ³ μ νλ Nκ°μ κ°μ μ λ³΄κ° μ£Όμ΄μ‘μ λ, Nκ°μ κ°μμ λνμ¬ μκ°νκΈ°κΉμ§λ 걸리λ μ΅μ μκ°μ μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±ν΄λΌ.
μ λ ₯쑰건
- 첫째μ€μ λλΉμ΄κ° λ£κ³ μ νλ κ°μμ μ N(1 <= N <= 500)μ΄ μ£Όμ΄μ§λ€.
- λ€μ Nκ°μ μ€μλ κ° κ°μμ κ°μμκ°κ³Ό κ·Έ κ°μλ₯Ό λ£κΈ° μν΄ λ¨Όμ λ€μ΄μΌ νλ κ°μλ€μ λ²νΈκ° μμ°μλ‘ μ£Όμ΄μ§λ©°, κ° μμ°μλ 곡백μΌλ‘ ꡬλΆλλ€. μ΄ λ κ°μ μκ°μ 100,000 μ΄νμ μμ°μμ΄λ€.
- κ° κ°μ λ²νΈλ 1λΆν° NκΉμ§λ‘ ꡬμ±λλ©°, κ° μ€μ -1λ‘ λλλ€.
μΆλ ₯쑰건
- Nκ°μ κ°μμ λν΄ μκ°νκΈ°κΉμ§ 걸리λ μ΅μ μκ°μ ν μ€μ νλμ© μΆλ ₯νλ€.
μ λ ₯ μμ
5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1
μΆλ ₯ μμ
10
20
14
18
17
βοΈIdea Sketch
μκ³ λ¦¬μ¦ : μμ μ λ ¬
λ¬Έμ μμ "μ μ κ°μκ° μλ κ°μλ μ μ κ°μλ₯Ό λ¨Όμ λ€μ΄μΌλ§ ν΄λΉ κ°μλ₯Ό λ€μ μ μλ€. " λ λ¬Έμ₯μμ λμΉμ± μ μλ€. μμ μ λ ¬μ μμκ° μ ν΄μ Έ μλ μΌλ ¨μ μμ μ μ°¨λ‘λλ‘ μνν΄μΌν λ μ¬μ©νλ μκ³ λ¦¬μ¦μ΄λ€. λ°©ν₯ κ·Έλνμ λͺ¨λ λ Έλλ₯Ό λ°©ν₯μ±μ κ±°μ€λ₯΄μ§ μλλ‘ μμλλ‘ λμ΄νλ μ λ ¬ μκ³ λ¦¬μ¦μ΄λ€.
μκ°λ³΅μ‘λ
O(V + E)
μμ μ λ ¬μ μκ°λ³΅μ‘λλ O(V + E)μ΄λ€. μμ μ λ ¬μ μνν λλ λͺ¨λ λ Έλλ₯Ό νμνλ€. κ·Έλ¦¬κ³ ν λ Έλλ₯Ό νμν λλ§λ€ ν΄λΉ λ Έλμμ μΆλ°νλ κ°μ μ νμνλ€. (λ°©ν₯μ κ±°μ€λ₯΄μ§ μλλ€) κ²°κ³Όμ μΌλ‘ λͺ¨λ λ Έλμ κ°μ μ νμΈνλ―λ‘ O(V + E)μ μκ°μ΄ μμλλ€.
βοΈλ΄ μμ€μ½λ
- * (Asterisk)λ₯Ό μ¬μ©ν΄ κ°μμκ° tμ μ μ κ°μ node λ°°μ΄μ μ μ₯νλ€. node λ°°μ΄μ forλ¬ΈμΌλ‘ νμνλ©΄μ μΈμ 리μ€νΈ λ°©ν₯ κ·Έλνλ₯Ό ꡬννλ€. iλ κ°μ λ²νΈ, node λ°°μ΄μ μμλ κ°μ iλ₯Ό λ£κΈ° μν΄ λ¨Όμ λ€μ΄μΌ νλ μ μκ°μμμ μ λ νμ¬ κ΅¬ννλ€.
- μ§μ μ°¨μκ° 0μΈ λ Έλλ₯Ό μ°Ύμ queueμ μ μ₯νλ€. μ§μ μ°¨μκ° 0μ΄λΌλ λ§μ μ μ λ Έλκ° μλ€λ λ»μ΄λ―λ‘ μ΄ λ Έλκ° μΆλ°λ Έλμ΄λ€.
- λ°©ν₯μ κ±°μ€λ₯΄μ§ μκ³ μΈμ ν λ Έλλ₯Ό νμνλ€. ν λ² νμν λλ§λ€ μ§μ μ°¨μλ₯Ό 1 κ°μμν€κ³ , μ§μ μ°¨μκ° 0μ΄ λλ©΄ μ μ λ Έλκ° μλ€λ λ»μ΄λ―λ‘ queueμ μ μ₯νλ€.
- λ¬Έμ κ° "μ΅μ μκ°"μ ꡬνλ κ²μ΄λ―λ‘ min()μ μ¨μΌ κ² λ€κ³ μκ°ν μ μλ€. νμ§λ§ λμμ μ¬λ¬ κ°μ κ°μλ₯Ό λ€μ μ μκ³ , μ μ κ°μλ₯Ό λͺ¨λ λ€μ΄μΌ νλ€. μκ°μ΄ μ€λ 걸리λ μ μ κ°μλ₯Ό 무μνλ©΄ μλκ³ , λ°λμ κ³ λ €ν΄μ€μΌ νλ€. λ°λΌμ κ°μ μκ°μ΄ λ μ€λ 걸리λ κ²½μ°λ₯Ό μ°Ύλλ€λ©΄, max()λ‘ κ²°κ³Ό ν μ΄λΈμ κ°±μ ν΄μ€λ€.
from collections import deque
import sys
si = sys.stdin.readline
n = int(si())
time = [0] * (n + 1)
res = [0] * (n + 1)
indegree = [0] * (n + 1) # μ§μ
μ°¨μ
graph = [[] for i in range(n + 1)]
for i in range(1, n+1):
t, *node = map(int, si().split())
time[i] = t
res[i] = t
for j in range(len(node)-1): # λ§μ§λ§ μμ -1
graph[node[j]].append(i) # μ μ node[j] --> μ μ i λ°©ν₯
indegree[i] += 1 # μ§μ
μ°¨μλ₯Ό 1 μ¦κ°
def topology_sort():
queue = deque()
for i in range(1, n + 1):
if indegree[i] == 0:
queue.append(i)
while queue:
x = queue.popleft()
for y in graph[x]:
indegree[y] -= 1
res[y] = max(res[y], res[x] + time[y])
if indegree[y] == 0:
queue.append(y)
topology_sort()
for i in range(1, n + 1):
print(res[i])