μ΅μ μ μ₯ νΈλ¦¬ (MST)
μ μ₯ νΈλ¦¬ (Spanning Tree)

β κ·Έλν λ΄μ λͺ¨λ μ μ μ ν¬ν¨νλ νΈλ¦¬
β κ·Έλνμ μ΅μ μ°κ²° λΆλΆ κ·Έλν (N - 1)κ°μ κ°μ -> νΈλ¦¬ νν
μ΅μ μ μ₯ νΈλ¦¬ (Minimum spanning Tree)

β Spanning Tree μ€μμ κ°μ μ κ°μ€μΉ ν©μ΄ μ΅μ(Minimun)μΈ νΈλ¦¬

β μ΅μ μ μ₯ νΈλ¦¬λ μ¬λ¬ κ° μΌ μ μλ€.
MST ꡬν - ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦
β Greedyλ₯Ό μ΄μ©ν΄ κ° λ¨κ³μμ μ¬μ΄ν΄μ μ΄λ£¨μ§ μλ μ΅μ λΉμ© κ°μ μ μ ννλ€.
λμ μμ

- κ°μ μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νλ€. (μ΅μ λΉμ©)
- μ λ ¬λ κ°μ 리μ€νΈμμ μμλλ‘ μ¬μ΄ν΄μ νμ±νμ§ μλ κ°μ μ μ ννλ€.
(Union - Find μ΄μ©: Union-Find μκ³ λ¦¬μ¦μ΄λ?!) - μ νν κ°μ μ νμ¬ MSTμ§ν©μ μΆκ°νλ€.
μμ€ μ½λ
# V: μ μ κ°μ, E: κ°μ κ°μ
V, E = map(int, input().split())
# parent: λΆλͺ¨ ν
μ΄λΈ (μκΈ° μμ μΌλ‘ μ΄κΈ°ν)
parent = [i for i in range(V + 1)]
# find ν¨μ
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
# union ν¨μ
def merge(x, y):
x = find(x)
y = find(y)
if x < y:
parent[y] = x
else:
parent[x] = y
return
# edges: κ°μ μ 보λ₯Ό λ΄μ 리μ€νΈ, total_cost: μ΅μ μ μ₯ νΈλ¦¬μ κ°μ€μΉ ν©κ³
edges = []
total_cost = 0
# κ°μ μ 보 μ
λ ₯
for _ in range(E):
node1, node2, cost = map(int, input().split())
edges.append((cost, node1, node2))
# κ°μ€μΉ κΈ°μ€μΌλ‘ μ λ ¬
edges.sort()
# κ° κ°μ μ λν΄ μ λμ¨-νμΈλλ‘ cylce μ¬λΆ νλ¨νμ¬ ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦ μν
for i in range(E):
cost, node1, node2 = edges[i]
# λΆλͺ¨ λ
Έλκ° λ€λ₯΄λ©΄ cylceνμ§ μλ€
if find(node1) != find(node2):
# mstμ ν¬ν¨
merge(node1, node2)
# κ°μ€μΉ κ³μ°
total_cost += cost
# κ°μ€μΉ ν©κ³ μΆλ ₯
print(total_cost)
'β Personal_Study > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Segment Tree (0) | 2022.12.03 |
---|---|
[μκ³ λ¦¬μ¦] λ€μ΅μ€νΈλΌ (Dijkstra) (0) | 2022.10.01 |
[μκ³ λ¦¬μ¦] Union-Find (1) | 2022.09.28 |
λκΈ