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

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

  1. ๊ฐœ์„  ํ”„๋ฆผ - 2
  2. ๋ฐฑํŠธ๋ž˜ํ‚น

๊ฐœ์„ ๋œ ํ”„๋ฆผ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„๋ณต์žก๋„

๊ฐ•์ฃ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๊ฒ ๋‹ค

from heapdict import heapdict

def prim(graph, start):
    mst, keys, pi, total_weight = list(), heapdict(), dict(), 0
    for node in graph.keys():
        keys[node] = float('inf')
        pi[node] = None
    keys[start], pi[start] = 0, start

    while keys:
        current_node, current_key = keys.popitem()
        mst.append([pi[current_node], current_node, current_key])
        total_weight += current_key
        for adjacent, weight in mygraph[current_node].items():
            if adjacent in keys and weight < keys[adjacent]:
                keys[adjacent] = weight
                pi[adjacent] = current_node
    return mst, total_weight

mygraph = {
    'A': {'B': 7, 'D': 5},
    'B': {'A': 7, 'D': 9, 'C': 8, 'E': 7},
    'C': {'B': 8, 'E': 5},
    'D': {'A': 5, 'B': 9, 'E': 7, 'F': 6},
    'E': {'B': 7, 'C': 5, 'D': 7, 'F': 8, 'G': 9},
    'F': {'D': 6, 'E': 8, 'G': 11},
    'G': {'E': 9, 'F': 11}    
}
mst, total_weight = prim(mygraph, 'A')
print ('MST:', mst)
print ('Total Weight:', total_weight)

๊ตฌ๊ฐ„

  1. ์ดˆ๊ธฐํ™” ๊ตฌ๊ฐ„ -> $O(V)$
  2. ํž™์—์„œ popํ•˜๋Š” ๊ตฌ๊ฐ„ -> $O(V log V)$
    ํž™์—์„œ pop : $O(log V)$ (keys.popitem)
    ์œ„ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํšŸ์ˆ˜ : $V$ (while keys)
  3. ์ธ์ ‘๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ํž™์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ตฌ๊ฐ„ -> $O(E log V)$
    ํž™์„ ์—…๋ฐ์ดํŠธ : $O(log V)$ (keys[adjacent] = weight)
    ์œ„ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํšŸ์ˆ˜ : $O(E)$ (for โ€ฆ in mygraph[current_node].items())

๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(V + V log V + E log V)$๋กœ
$O(E log V)$๊ฐ€ ๋œ๋‹ค.

$O(E log V) < O(E log E)$๋Š” $V \le E$๊ฐ€ ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ

๋ฐฑํŠธ๋ž˜ํ‚น ๊ธฐ๋ฒ•

์ œ์•ฝ ์กฐ๊ฑด ๋งŒ์กฑ ๋ฌธ์ œ์—์„œ ํ•ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•

ํ•ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด์„ ์ฒดํฌํ•˜๋ฉด์„œ ๋„˜์–ด๊ฐ€๊ณ , ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ์— ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋ก ์ฒดํฌํ•ด๋‘๋Š” ๊ธฐ๋ฒ•

๊ตฌํ˜„์‹œ, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ƒํƒœ๊ณต๊ฐ„ ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ํ•˜๊ณ ,
dfsํ•˜๋ฉด์„œ ์กฐ๊ฑด์ด ๋งž๋Š”์ง€ ๊ฒ€์ƒ‰ํ•˜๊ณ (Promising),
์กฐ๊ฑด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋” ๊นŠ์ด ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ํƒ์ƒ‰์ง€์ ์œผ๋กœ ๊ฐ„๋‹ค.(๊ฐ€์ง€์น˜๊ธฐ, Pruning)

์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ : ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •์˜ ์ค‘๊ฐ„ ์ƒํƒœ๋ฅผ ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋กœ ๋‚˜ํƒ€๋‚ธ ํŠธ๋ฆฌ
(์ด๊ฑด ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค??)

ํŠธ๋ฆฌ

๋งˆ์ง€๋ง‰

๋ฐฑํŠธ๋ž˜ํ‚น๋„ ์“ธ์ผ๋งŽ์•„์„œ ์ž˜ ์•Œ์•„๋‘ฌ์•ผํ•œ๋‹ค.

์ˆ˜๊ฐ•

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