์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 28
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ๊ฐ์ ํ๋ฆผ - 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)
- ์ด๊ธฐํ ๊ตฌ๊ฐ -> $O(V)$
- ํ์์ popํ๋ ๊ตฌ๊ฐ -> $O(V log V)$
ํ์์ pop : $O(log V)$ (keys.popitem)
์ ์ฐ์ฐ์ ํ๋ ํ์ : $V$ (while keys) - ์ธ์ ๋
ธ๋๋ฅผ ํตํด ํ์ ์
๋ฐ์ดํธ ํ๋ ๊ตฌ๊ฐ -> $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)
์ํ๊ณต๊ฐํธ๋ฆฌ : ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ์ค๊ฐ ์ํ๋ฅผ ๊ฐ๊ฐ์ ๋
ธ๋๋ก ๋ํ๋ธ ํธ๋ฆฌ
(์ด๊ฑด ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค??)
๋ง์ง๋ง
๋ฐฑํธ๋ํน๋ ์ธ์ผ๋ง์์ ์ ์์๋ฌ์ผํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ