์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 26

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋กPermalink

  1. ํ”„๋ฆผ - 2
  2. ํ”„๋ฆผ - 3

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„Permalink

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

๋งˆ์ง€๋ง‰Permalink

์ด๋ฒˆ ๋‘ ๊ฐ•์˜์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์„ ํ–ˆ๋‹ค.
๋‹ค์Œ ๊ฐ•์˜์—์„œ๋Š” ๊ฐœ์„ ๋œ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

์ˆ˜๊ฐ•
+๊นจ์•Œ ์˜คํƒ€, ์•Œ๊ณ ๋ฅด์ฆ˜

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ