์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 26
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋กPermalink
- ํ๋ฆผ - 2
- ํ๋ฆผ - 3
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํPermalink
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํด๋ณด๊ณ , ์ ๊ทธ๋ํ์ 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๊ฐ ์๋ ๊ทธ๋ํ์ฒ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
๋ง์ง๋งPermalink
์ด๋ฒ ๋ ๊ฐ์์์๋ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ํ๋ค.
๋ค์ ๊ฐ์์์๋ ๊ฐ์ ๋ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๊ฒ์ด๋ค.
+๊นจ์ ์คํ, ์๊ณ ๋ฅด์ฆ
๋๊ธ๋จ๊ธฐ๊ธฐ