๊ฐ๋
์ ์ฅ ํธ๋ฆฌ(Spanning Tree)
- ๋ชจ๋ ์ ์ ์ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์๋ ๊ทธ๋ํ
- ํน์ง
- ์ ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ํฌํจ
- ๊ฐ์ (node) ์ = ์ ์ ์ - 1
- ๋ ธ๋ ๊ฐ ์ฌ์ดํด์ ํ์ฑํ์ง ์์
- ํ ๊ทธ๋ํ ๋ด์์ ์ฌ๋ฌ ๊ฐ์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์์
์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimum Spanning Tree)

- ๊ฐ์ (node) ๊ฐ์ค์น์ ํฉ์ด ๊ฐ์ฅ ์์ ์ ์ฅ ํธ๋ฆฌ
- ๊ฐ์ (node) ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๋ถํฐ ํ์ํ์ฌ ์ ์ฅํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์
- ๋ํ ์๊ณ ๋ฆฌ์ฆ : Kruskal ์๊ณ ๋ฆฌ์ฆ, Prim ์๊ณ ๋ฆฌ์ฆ
- ์ฐจ์ด์
- Kruskal ์๊ณ ๋ฆฌ์ฆ : ๊ฐ์ (node)๋ฅผ ์ค์ฌ์ผ๋ก ํ์ฌ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑ
- Prim ์๊ณ ๋ฆฌ์ฆ : ์ ์ (spot)์ ์ค์ฌ์ผ๋ก ํ์ฌ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑ
- ์ฐจ์ด์
ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ์ฅ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ (node)๋ถํฐ ํ์ํ๋ฉฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ
์ด๋ก
- ์ ์ฅ ํธ๋ฆฌ ๋ฐฐ์ด ์์ฑ
- ๊ฐ์ฅ ์์ ๊ฐ์ (node) ๊ฐ์ค์น ํ์
- ์ ์ฅ ํธ๋ฆฌ ๋ฐฐ์ด์ ๊ฐ์ฅ ์์ ๊ฐ์ (node) ๊ฐ์ค์น ํฌํจ ์ฌ๋ถ ํ์ธ
- ํฌํจํ์ง ์๋๋ค๋ฉด ํฌํจ
- ํฌํจํ๊ณ ์๋ค๋ฉด ์ง๋๊ฐ
- 2๋ฒ์ผ๋ก ๋์๊ฐ
๋จ๊ณ๋ณ๋ก ๋ฐ์๋ณด๊ธฐ

1. ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด์ ์์ฑ
| ์ ์ฅ ํธ๋ฆฌ | ํธ๋ฆฌ ๊ฐ์ ๊ฐ์ค์น |
| 0 |
2. ์ ์ฅ ํธ๋ฆฌ ๊ฐ์ (node) ์ค ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ๊ฒ ํ์

3. ์ ์ฅ ํธ๋ฆฌ ๋ด ๊ฐ์ ์ด ์กด์ฌํ๋ ์ง ํ์ธ ํ, ์๋ค๋ฉด ์ถ๊ฐ
| ์ ์ฅ ํธ๋ฆฌ | ํธ๋ฆฌ ๊ฐ์ ๊ฐ์ค์น |
| 1,3 | 1 |
4. 2๋ฒ์งธ๋ก ์์ ๊ฐ์ (node) ๊ฐ์ค์น ํ์

5. ์ ์ฅ ํธ๋ฆฌ ๋ด ๊ฐ์ ์ด ์กด์ฌํ๋ ์ง ํ์ธ ํ, ์๋ค๋ฉด ์ถ๊ฐ
| ์ ์ฅ ํธ๋ฆฌ | ํธ๋ฆฌ ๊ฐ์ ๊ฐ์ค์น |
| 1,3,4,5 | 3 |
6. ๋ค์ ์ต์ ๊ฐ์ (node) ๊ฐ์ค์น ํ์

7. ์ ์ฅ ํธ๋ฆฌ ๋ด ๊ฐ์ ์ด ์กด์ฌํ๋ ์ง ํ์ธ ํ, ์๋ค๋ฉด ์ถ๊ฐ
| ์ ์ฅ ํธ๋ฆฌ | ํธ๋ฆฌ ๊ฐ์ ๊ฐ์ค์น |
| 1,2,3,4,5 | 6 |
8. ๋ค์ ์ต์ ๊ฐ์ (node) ๊ฐ์ค์น ํ์

9. ์ ์ฅ ํธ๋ฆฌ ๋ด ๊ฐ์ ์ด ์กด์ฌํ๋ ์ง ํ์ธ ํ, ์๋ค๋ฉด ์ถ๊ฐ
| ์ ์ฅ ํธ๋ฆฌ | ํธ๋ฆฌ ๊ฐ์ ๊ฐ์ค์น |
| 1,2,3,4,5,6 | 12 |
10. ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋ชจ๋ ์ ์ ์ ํฌํจํ๋ค๋ฉด ์ค๋จ
๊ตฌํ
- Union-Find ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ
- ๊ฐ์ ๊ฐ์ค์น๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ(์ต์ ๊ฐ์ค์น๋ถํฐ ํ์)
- ์ํํ๋ ์ง ํ๋จ ํ(Union-Find) ์ํํ์ง ์๋๋ค๋ฉด ๊ฐ์ (node)๋ฅผ ์ ์ฅํ๋ฉฐ ์งํ
2024.01.07 - [Algorithm/๊ฐ๋ ] - [์๊ณ ๋ฆฌ์ฆ] Union-Find
[์๊ณ ๋ฆฌ์ฆ] Union-Find
๊ฐ๋ ๊ทธ๋ํ ์ด๋ก ์ผ๋ก, ์ํธ ๋ฐฐํ์ ์งํฉ(์๋ก์์งํฉ:Disjoint-Set) ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ๋ถ๋ฆ ์ฃผ๋ก ํฌ๋ฃจ์ค์นผ(Krusckal) ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉํ๋ฉฐ, ์ํํ์ง ์๋ ํธ๋ฆฌ ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ ๋จ๊ณ๋ณ๋ก ์ดํด
l1m3kun.tistory.com
์ฝ๋
# 1922 ๋คํธ์ํฌ ์ฐ๊ฒฐ
import sys
input = sys.stdin.readline
# MST (Ksruskal Algorithm)
# root ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ(parent ๋ฐฐ์ด ์ด์ฉ)
def find(num:int) -> int:
# ๋ถ๋ชจ ๋
ธ๋๊ฐ ๋, ๋ ์์ ์ด root ์ด๋ฉด ๋ฉ์ถค
if parent[num] == num:
return num
# parent ๋ฐฐ์ด์ ํตํด ์์ ๋
ธ๋๋ฅผ ์ฐพ์์ ์ ์ฅ
parent[num] = find(parent[num])
return parent[num]
# ๋ spot์ ์ด์ด์ค
def union(num1:int, num2:int) -> None:
# ๋ root๋ฅผ ์ฐพ์์
x = find(num1)
y = find(num2)
# ์ํ๋์ง ์๋๋ค๋ฉด ํ๋์ ๊ณ ๋ฆฌ๋ก ์ด์ด์ค
if x != y:
parent[y] = x
return
def kruskal():
# Kruskal ์๊ณ ๋ฆฌ์ฆ == ์ต์ ์ ์ฅํธ๋ฆฌ
node = [] # ์ง๋์จ ๋
ธ๋ ์ ์ฅ์ฉ
cost = 0 # ๋น์ฉ ์ ์ฅ
for i in range(M):
c, a, b = network[i] # ๋น์ฉ์ด ๊ฐ์ฅ ์ ์ ๋
ธ๋๋ถํฐ ๊ฐ์ ธ์ด
if find(a) == find(b): # ์ํ๋๋ฉด ํจ์ค
continue
node.append(i) # ์ง๋์จ ๋
ธ๋๋ ์ ์ฅ
union(a, b) # ์ง๋๊ฐ ์ ์๋ค == ์ด์ด์ ธ์๋ค
cost += c # ๋น์ฉ ์ ์ฅ
if len(node) == N-1: # ๋ชจ๋ ๋
ธ๋ ๋ค ํ์ํ์ผ๋ฉด ๋น์ฉ return -> ์ต์ ๋น์ฉ์
return cost
return cost'๐ STUDY > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๊ณ ๋ฆฌ์ฆ] ๋์ ํฉ(Prefix Sum) (0) | 2024.04.02 |
|---|---|
| 11286. ์ ๋๊ฐ ํ (0) | 2024.03.12 |
| 18111. ๋ง์ธํฌ๋ํํธ (1) | 2024.01.09 |
| [์๊ณ ๋ฆฌ์ฆ] Union-Find (1) | 2024.01.07 |
| 1717. ์งํฉ์ ํํ (2) | 2024.01.07 |