자료ꡬ쑰/πŸ‘‰μ•Œκ³ λ¦¬μ¦˜ - 26

였늘 듀은 κ°•μ˜ λͺ©λ‘

  1. ν”„λ¦Ό - 2
  2. ν”„λ¦Ό - 3

ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„

p1

ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•΄λ³΄κ³ , μœ„ κ·Έλž˜ν”„μ˜ Aμ—μ„œ μ‹œμž‘ν•΄μ„œ ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ„ ν…ŒμŠ€νŠΈν•΄λ³΄κ² λ‹€.

ν”„λ¦Όμ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  1. μ‹œμž‘ λ…Έλ“œλ₯Ό 선택
  2. μ„ νƒν•œ λ…Έλ“œλ₯Ό β€œμ—°κ²°λœ λ…Έλ“œ 집합”에 λ„£μŒ
  3. μ„ νƒν•œ λ…Έλ“œμ™€ μ—°κ²°λœ 간선듀을 β€œκ°„μ„  λ¦¬μŠ€νŠΈβ€μ— λ„£μŒ
  4. β€œκ°„μ„  λ¦¬μŠ€νŠΈβ€μ—μ„œ μ΅œμ†Œ κ°€μ€‘μΉ˜λ₯Ό κ°€μ§„ 간선을 선택
  5. μ„ νƒν•œ κ°„μ„ μ˜ 인접 λ…Έλ“œκ°€ β€œμ—°κ²°λœ λ…Έλ“œ 집합”에 μ†ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•΄λ‹Ή κ°„μ„ κ³Ό μ—°κ²°λœ λ…Έλ“œλ₯Ό νŠΈλ¦¬μ— μΆ”κ°€,
    ν•΄λ‹Ή λ…Έλ“œλ₯Ό β€œμ—°κ²°λœ λ…Έλ“œ 집합”에 μΆ”κ°€, ν•΄λ‹Ή λ…Έλ“œμ˜ 간선듀을 β€œκ°„μ„  λ¦¬μŠ€νŠΈβ€μ— μΆ”κ°€
  6. μ„ νƒν•œ 간선을 β€œκ°„μ„  λ¦¬μŠ€νŠΈβ€μ—μ„œ 제거
  7. β€œκ°„μ„  λ¦¬μŠ€νŠΈβ€μ— 간선이 없을 λ•ŒκΉŒμ§€ 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')

prim

μ •μƒμ μœΌλ‘œ mstκ°€ μ•„λž˜ κ·Έλž˜ν”„μ²˜λŸΌ κ²°κ³Όκ°€ λ‚˜μ™”λ‹€.

p1 p2 p3

λ§ˆμ§€λ§‰

이번 두 κ°•μ˜μ—μ„œλŠ” 기본적인 ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„μ„ ν–ˆλ‹€.
λ‹€μŒ κ°•μ˜μ—μ„œλŠ” κ°œμ„ λœ ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  것이닀.

μˆ˜κ°•
+κΉ¨μ•Œ μ˜€νƒ€, μ•Œκ³ λ₯΄μ¦˜

λŒ“κΈ€λ‚¨κΈ°κΈ°