μλ£κ΅¬μ‘°/πμκ³ λ¦¬μ¦ - 26
μ€λ λ€μ κ°μ λͺ©λ‘
- νλ¦Ό - 2
- νλ¦Ό - 3
νλ¦Ό μκ³ λ¦¬μ¦ κ΅¬ν

νλ¦Ό μκ³ λ¦¬μ¦μ ꡬνν΄λ³΄κ³ , μ κ·Έλνμ Aμμ μμν΄μ νλ¦Ό μκ³ λ¦¬μ¦μ ν μ€νΈν΄λ³΄κ² λ€.
νλ¦Όμκ³ λ¦¬μ¦ κ΅¬ν λ΄μ©μ λ€μκ³Ό κ°λ€.
- μμ λ Έλλ₯Ό μ ν
- μ νν λ Έλλ₯Ό βμ°κ²°λ λ Έλ μ§ν©βμ λ£μ
- μ νν λ Έλμ μ°κ²°λ κ°μ λ€μ βκ°μ 리μ€νΈβμ λ£μ
- βκ°μ 리μ€νΈβμμ μ΅μ κ°μ€μΉλ₯Ό κ°μ§ κ°μ μ μ ν
- μ νν κ°μ μ μΈμ λ
Έλκ° βμ°κ²°λ λ
Έλ μ§ν©βμ μνμ§ μλλ€λ©΄ ν΄λΉ κ°μ κ³Ό μ°κ²°λ λ
Έλλ₯Ό νΈλ¦¬μ μΆκ°,
ν΄λΉ λ Έλλ₯Ό βμ°κ²°λ λ Έλ μ§ν©βμ μΆκ°, ν΄λΉ λ Έλμ κ°μ λ€μ βκ°μ 리μ€νΈβμ μΆκ° - μ νν κ°μ μ βκ°μ 리μ€νΈβμμ μ κ±°
- βκ°μ 리μ€νΈβμ κ°μ μ΄ μμ λκΉμ§ 4λ²μμ 6λ² λ°λ³΅
from collections import defaultdict
from heapq import *
def prim(edges, start_node):
tree = []
# κ° λ
Έλλ³λ‘ μ°κ²°λ κ°μ μ μ 리
edgesOf = defaultdict(list)
for weight, n1, n2 in edges:
edgesOf[n1].append((weight, n1, n2))
edgesOf[n2].append((weight, n2, n1))
# μ°κ²°λ λ
Έλλ€
connected_n = set(start_node)
# κ°μ 리μ€νΈ
connected_e = edgesOf[start_node]
heapify(connected_e)
while connected_e:
next_e = heappop(connected_e)
if next_e[2] not in connected_n:
# νΈλ¦¬μ κ²½λ‘ μΆκ°
tree.append(next_e)
# μ°κ²°λ λ
Έλμ μΆκ°
connected_n.add(next_e[2])
# κ°μ 리μ€νΈμ μΆκ°
for edge in edgesOf[next_e[2]]:
# μΆκ°νλ €λ λ
Έλκ° μ°κ²°λμ§ μμ κ²½μ° μΆκ°
if edge[2] not in connected_n:
heappush(connected_e, edge)
return tree
graph = [
(7, 'A', 'B'), (5, 'A', 'D'),
(8, 'B', 'C'), (9, 'B', 'D'), (7, 'B', 'E'),
(5, 'C', 'E'),
(7, 'D', 'E'), (6, 'D', 'F'),
(8, 'E', 'F'), (9, 'E', 'G'),
(11, 'F', 'G')
]
prim(graph, 'A')
μ μμ μΌλ‘ mstκ° μλ κ·Έλνμ²λΌ κ²°κ³Όκ° λμλ€.

λ§μ§λ§
μ΄λ² λ κ°μμμλ κΈ°λ³Έμ μΈ νλ¦Ό μκ³ λ¦¬μ¦ κ΅¬νμ νλ€.
λ€μ κ°μμμλ κ°μ λ νλ¦Ό μκ³ λ¦¬μ¦μ ꡬνν κ²μ΄λ€.
+κΉ¨μ μ€ν, μκ³ λ₯΄μ¦
λκΈλ¨κΈ°κΈ°