2024. 2. 7. 23:02ใCS - Roadmap.sh/3. Common Algorithms
CS - 3. Common Algorithms - 3.6 Greedy Algorithms - 3.6.4 Prim's algorithm
Prim’s Algorithm
๐ก Prim’s algorithm is a greedy algorithm that finds a minimum spanning tree for a weighted undirected graph. A minimum spanning tree is a subset of the edges of a connected, edge-weighted undirected graph that connects all the vertices together, without any cycles and with the minimum possible total edge weight. A minimum spanning tree for a weighted undirected graph is also called a minimum weight spanning tree or minimum cost spanning tree.
ํ๋ฆผ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ค์น๊ฐ ์๋ ๋ฐฉํฅ์ฑ ์๋ ๊ทธ๋ํ์ ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ฐพ๋ ํ์์ค๋ฌ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ ๋ชจ๋ ์ ์ ์ ์ํ ์์ด ๊ฐ๋ฅํ ์ต์ํ์ ์ด ์์ง ๊ฐ์ค์น๋ก ์ฐ๊ฒฐํ๋ ์ฐ๊ฒฐ๋ ์์ง ๊ฐ์ค ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ ์์ง ํ์ ์งํฉ์ ๋๋ค. ๊ฐ์ค์น๊ฐ ์ ์ฉ๋ ๋ฐฉํฅ์ฑ ์๋ ๊ทธ๋ํ์ ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ ์ต์ ๊ฐ์ค์น ์คํจ๋ ํธ๋ฆฌ ๋๋ ์ต์ ๋น์ฉ ์คํจ๋ ํธ๋ฆฌ๋ผ๊ณ ๋ ํฉ๋๋ค.
Prim's Algorithm์ ๊ทธ๋ํ ์ด๋ก ์์ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์
๋๋ค. ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์๊ฐ ๋๋ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ ์ ์์๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ์ ํํ์ฌ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ํ์ฅํด ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
Prim's Algorithm์ ์๋ ๊ณผ์ ์ ์ด๋ ์ต๋๋ค.
1. ์์ํ ์ ์ ์ ์ ํํฉ๋๋ค.
2. ์ ํํ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ค ์ค์์ ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๊ฐ์ ์ ์ ํํฉ๋๋ค.
3.์ ํํ ๊ฐ์ ์ ์ฐ๊ฒฐ๋ ์ ์ ์ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ผ๋ถ๋ก ์ถ๊ฐํฉ๋๋ค.
4. ๋ชจ๋ ์ ์ ์ด ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋ ๋๊น์ง 2-3๋จ๊ณ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
In Python
import heapq
def prim(graph, start_node):
mst = list()
visited = [False] * len(graph)
queue = [(0, start_node)]
while queue:
weight, node = heapq.heappop(queue)
if not visited[node]:
visited[node] = True
mst.append((weight, node))
for edge in graph[node]:
heapq.heappush(queue, edge)
return mst
Prim ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋ ธ๋์์๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ์ ํํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ํ์ฅํด ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์์ ๋ ธ๋ 0์์ ์ด๋ค์์ผ๋ก ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ด ์งํ๋๋์ง ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1. ์์ ๋
ธ๋๋ 0์ด๋ฉฐ, ์์ง ์ด๋ค ๋
ธ๋๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋์ง ์์์ต๋๋ค. ๋ฐ๋ผ์ ์์ ๋
ธ๋ 0์ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋์ ์ํ๋ฅผ (0, 0)์ผ๋ก ํํํ์์ต๋๋ค.
2. ๋
ธ๋ 0๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค ์ค ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๋
ธ๋๋ฅผ ์ ํํฉ๋๋ค. ๋
ธ๋ 0๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ 1, 2์ด๋ฉฐ, ์ด ์ค ๊ฐ์ค์น๊ฐ ์์ ๋
ธ๋ 1์ ์ ํํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋์ ์ํ๋ฅผ (2, 1)๋ก ํํํ์์ต๋๋ค.
3. ์ด์ ๋
ธ๋ 0๊ณผ 1์ด ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋์์ต๋๋ค. ์ด ๋ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค ์ค ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๋
ธ๋๋ฅผ ์ ํํฉ๋๋ค. ๋
ธ๋ 1๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋ 3์ ์ ํํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋์ ์ํ๋ฅผ (1, 3)๋ก ํํํ์์ต๋๋ค.
4. ๋
ธ๋ 0, 1, 3์ด ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋์์ต๋๋ค. ์ด ์ธ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค ์ค ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๋
ธ๋๋ฅผ ์ ํํฉ๋๋ค. ๋
ธ๋ 3๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋ 2์ ์ ํํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋์ ์ํ๋ฅผ (1, 2)๋ก ํํํ์์ต๋๋ค.
5. ๋ง์ง๋ง์ผ๋ก, ๋
ธ๋ 0, 1, 2, 3์ด ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋์์ต๋๋ค. ์ด ๋ค ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค ์ค ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๋
ธ๋๋ฅผ ์ ํํฉ๋๋ค. ๋
ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋
ธ๋ 4์ ์ ํํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋์ ์ํ๋ฅผ (5, 4)๋ก ํํํ์์ต๋๋ค.
์ต์ข
์ ์ผ๋ก ๋ชจ๋ ๋
ธ๋๊ฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋์์ผ๋ฏ๋ก, ์๊ณ ๋ฆฌ์ฆ์ ์ข
๋ฃ๋ฉ๋๋ค. ์ด๋ ๊ฒ Prim ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋จ๊ณ์์ ๊ฐ์ฅ ๊ฐ์ค์น๊ฐ ์์ ๋
ธ๋๋ฅผ ์ ํํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋ฉ๋๋ค.
ํ์ฉ
์ฌ๋ฌ ์์น๋ฅผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ฐ๊ฒฐํด์ผํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
"์ต์ ์ ์ฅ ํธ๋ฆฌ"๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ถ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
1. ํต์ ๋คํธ์ํฌ
2. ์ ๋ ฅ ๊ทธ๋ฆฌ๋
๋ฑ๋ฑ..
'CS - Roadmap.sh > 3. Common Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3.7.2 In-Order Traversal(์ค์ ์ํ) (0) | 2024.02.09 |
---|---|
3.7.1 Pre-Order Traversal(์ ์ ์ํ) (0) | 2024.02.08 |
3.6.3 Ford Fulkerson algorithm(ํด๋ํ์ปค์จ ์๊ณ ๋ฆฌ์ฆ) (1) | 2024.02.06 |
3.6.2 Kruskalโs algorithm (ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ) (1) | 2024.02.05 |
3.6 Greedy Algorithms - 3.6.1 Huffman Coding (0) | 2024.02.03 |