~๋ชฉ์ฐจ~
(์ต์) ์คํจ๋ ํธ๋ฆฌ๋?
์ต์ ์คํจ๋ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ด์ ์ ์คํจ๋ ํธ๋ฆฌ(Spanning Tree)๋ ๋ฌด์์ธ๊ฐ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์คํจ๋ ํธ๋ฆฌ๋ ์ด๋ค ๊ทธ๋ํ์์ ๋ชจ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ ์ฌ์ดํด์ด ์๋ ๋ถ๋ถ ๊ทธ๋ํ๋ฅผ ์๋ฏธํฉ๋๋ค
๊ทธ๋ฆผ์ผ๋ก ์ดํดํด๋ณด๊ฒ ์ต๋๋ค
์ผ์ชฝ๊ณผ ๊ฐ์ ์ด๊ธฐ ๊ทธ๋ํ๊ฐ ์์ ๋ ์ค๋ฅธ์ชฝ ๊ทธ๋ํ๋ ์คํจ๋ ํธ๋ฆฌ์ ๋๋ค.
๊ทธ๋ผ ์๋ ๊ทธ๋ํ๋ ์คํจํ ํธ๋ฆฌ ์ผ๊น์?
์๋๋๋ค. ์ค๋ฅธ์ชฝ ๊ทธ๋ํ๋ ์ฌ์ดํด์ด ๋ฐ์ํ๊ณ , ์ค๋ฅธ์ชฝ ๊ทธ๋ํ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ์ง ์๊ณ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ ๊ทธ๋ํ๋ ์ ์ฅ(์คํจ๋) ํธ๋ฆฌ์ผ๊น์?
๊ทธ๋ ์ต๋๋ค. ์ ์ฅ ํธ๋ฆฌ ์ค ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ๋๋ค.
์ต์ ์ ์ฅ(์คํจ๋) ํธ๋ฆฌ๋ ์ ์ฅ ํธ๋ฆฌ ์ค ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๊ฐ๋ ๊ทธ๋ํ์ ๋๋ค.
๋ชจ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ ์ ๊ฐ์๋ '(๋ ธ๋ ๊ฐ์) - 1' ์ ๋๋ค
์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํฌ๋ฃจ์ค์นผ(kruskal) ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ฆผ(prim) ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค
๋ ์๊ณ ๋ฆฌ์ฆ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ ์ค ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๊ฐ๋ ๊ฐ์ ๋ถํฐ ์ฐ๊ฒฐํด ๋๊ฐ๋ฏ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํฉ๋๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ | Kruskal
๊ทธ๋ ๋ค๋ฉด ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ์์๊น์?
๊ทธ ๋ํ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋์ธ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จ์ ์๋ ๊ฐ์ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ๋ถํฐ ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ฐ๊ฒฐํด ๋๊ฐ๋๋ค.
๊ฐ ๋ ธ๋๊ฐ ๊ฐ์ ์งํฉ์ ์ํ๋์ง ํ์ธํ๊ธฐ ์ํด์ ์๋ก์ ์งํฉ ๊ฐ๋ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ๊ตฌํ ์ฝ๋
import sys
input = sys.stdin.readline # ์
๋ ฅ ์๋ ํฅ์์ ์ํ ์ฒ๋ฆฌ
parent = [i for i in range(V+1)] # ๊ฐ ๋
ธ๋๊ฐ ์ด๋ค ์งํฉ์ ์ํด์๋์ง ์ ๋ณด
result = 0
def find_parent(x): # x๋
ธ๋์ ๋ํด์ ์ด๋ค ์งํฉ์ ์ํ๋์ง ๋ฐํ
if parent[x] != x:
parent[x] = find_parent(parent[x]) # ์งํฉ ๋
ธ๋ ์
๋ฐ์ดํธ
return parent[x]
def union_parent(a, b):
a = find_parent(a) # a์ ์งํฉ
b = find_parent(b) # b์ ์งํฉ
if a < b: # ์์ ๋
ธ๋ ๋ฒํธ๋ก ํตํฉ
parent[b] = a
else:
parent[a] = b
V, E = map(int, input().split()) # ๋
ธ๋ ์, ๊ฐ์ ์
edges = [] # ๊ฐ์ ์ ๋ณด ์ ์ฅํ ๋ฆฌ์คํธ
for i in range(E):
a, b, w = map(int, input().split())
edges.append((w, a, b)) # (๋น์ฉ, ๋
ธ๋a, ๋
ธ๋b)
edges.sort() # ๋น์ฉ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for w, a, b in edges: # ์์ ๊ฐ์ ๋ถํฐ ์์ฐจ์ ์ผ๋ก
if find_parent(a) != find_parent(b): # ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์ผ๋ฉด
union_parent(a, b) # ์งํฉ ํตํฉ
result += w # ๊ฐ์ ๋น์ฉ ๊ณ์ฐ
print(result)
๋ฌธ์ ํ์ด
2023.05.23 - [๐๋ฌธ์ ํ์ด/๐งฉBaekjoon] - [Python] ๋ฐฑ์ค 1197 ์ต์ ์คํจ๋ ํธ๋ฆฌ
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ | Prim
์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค. ์คํจ๋ ํธ๋ฆฌ์ ๋ ธ๋๊ฐ ํฌํจ๋๋์ง ์ฌ๋ถ๋ set ์ ์ด์ฉํฉ๋๋ค
์ผ์ชฝ ์๋ถํฐ ์ค๋ฅธ์ชฝ ์๋๊น์ง ์์๋๋ก ๋ณด๋ฉด
1. ์์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ์ต์ํ์ผ๋ก ์์ฑ & ์์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐ
2. ์ต์ ๋น์ฉ์ ๊ฐ๋ ๋ ธ๋๋ฅผ ์ ํํ์ฌ ์ฐ๊ฒฐ๋์ง ์์๋ค๋ฉด ์ฐ๊ฒฐ & ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ํ์ ์ฝ์
3. 2 ๋ฐ๋ณต
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ ๊ตฌํ ์ฝ๋
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
n, m = map(int, input().split())
connected = set() # ์คํจ๋ ํธ๋ฆฌ์ ์ํ ๋
ธ๋
graph = [[] for _ in range(n+1)] # ๊ฐ ๋
ธ๋๋ณ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
startNode = (INF, 0) # (๊ธธ์ด, ๋
ธ๋)
result = 0
for _ in range(m): # ๊ฐ์
a, b, w = map(int, input().split())
# ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก ๋ ๋
ธ๋์ ๋ํด์ ๋ชจ๋ ์ฐ๊ฒฐ
graph[a].append((w, b))
graph[b].append((w, a))
startNode = (w, a) if startNode[0] > w else startNode # ๊ฐ์ฅ ์์ ๊ฐ์ ์ ๊ฐ์ง๋ ๋
ธ๋
q = graph[startNode[1]]
heapq.heapify(q) # ์์ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ค ์ต์ ํ ๋ณ๊ฒฝ
connected.add(startNode[1]) # ์์ ๋
ธ๋ ์ฐ๊ฒฐ
while q:
w, b = heapq.heappop(q) # ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ ์ค ๊ฐ์ฅ ์ ์ ๋น์ฉ
if b not in connected: # ์ฐ๊ฒฐ๋์ง ์์๋ค๋ฉด
connected.add(b) # ๋
ธ๋ ์ฐ๊ฒฐ
result += w # ๊ฐ์ ๋น์ฉ ๊ณ์ฐ
for w2, a2 in graph[b]: # ์ฐ๊ฒฐ๋ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ค
if a2 not in connected: # ์ด๋ฏธ ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ฉด
heapq.heappush(q, (w2, a2)) # ์ต์ ํ์ ์ฝ์
print(result)
๋์์ด ๋์ จ๋ค๋ฉด ์ข์์ ๋๋ฌ์ฃผ์ธ์๐
REFERENCE
<์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค with Python> ์์
'๐งชComputer Science > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ | ๋ค์ต์คํธ๋ผ | ํ๋ก์ด๋ ์์ (0) | 2023.05.17 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์๊ฐ๋ณต์ก๋ ๊ตฌํ๊ธฐ (0) | 2023.04.04 |