์ค๋์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํ๋๋ฐ์.
์ฌ๋ฌ๊ฐ์ ๋ ธ๋๋ฅผ ์ต์๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์ ์๋์ ์๋ฃ๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋์ต๋๋ค.
- ์๊ฒฝ์ก์ด ๊ฐ๋ฐ์ (ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ)
- ์ํค๋ฐฑ๊ณผ (ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ)
- Union-find ์๊ณ ๋ฆฌ์ฆ (sunghyunpatricklee)
์ด ๊ธ์์ ์์๋ณผ ๋ด์ฉ
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด๋
- ํต์ฌ ์์ด๋์ด
- ์์ ๋ฌธ์
- ๋ง์น๋ฉด์
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด๋
"MST (Minimum Spanning Tree) ๋ฅผ ์ฐพ๊ธฐ์ํ ์๊ณ ๋ฆฌ์ฆ". ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๋ ํต์ฌ์ ์ธ ๋ฌธ์ฅ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด MST ๋ ๋๋์ฒด ๋ฌด์์ผ๊น์? "๊ทธ๋ํ์ ๋ ธ๋๋ค์ ๊ฐ์ฅ ์ ์ ์ฐ๊ฒฐ, ๋น์ฉ์ผ๋ก ๋ชจ๋ ์ฐ๊ฒฐํํธ๋ฆฌ". ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ํจ๊ณผ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
ํต์ฌ ์์ด๋์ด
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ. ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด ์ํด์๋ ๋ถ๋ฅ์ ๋๋ค. ๋งค ์๊ฐ ์ต์ ์ ๊ฐ์ ์ ํํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ฐํ์ฃ . ๊ฐ๋จํ๊ฒ ์๊ฐํด๋ด ์๋ค. ๊ฐ์ฅ ์์ ๊ฐ์ค์น ์์๋๋ก ์ฐ๊ฒฐํ๋ฉด ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์ง ์์๊น์? ์ ๋ง ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ๋ค์ด ๋ฐ์์ ๋๋ค. ํ์ง๋ง ์ด๊ฑธ๋ก๋ ๋ถ์กฑํฉ๋๋ค. Minimum ์ ๋ฌ์ฑํ ์ ์์ง๋ง. Spanning Tree ๋ ๊ตฌํ์ ์คํจํฉ๋๋ค. Spanning Tree ๋ (Node ์ ์ - 1) ์ ๊ฐ์ ์ ๊ฐ์ง๋๋ค. ๋ค์์ Spanning Tree ๋ฅผ ์ค๋ช ํ๋ ๊ทธ๋ฆผ์ ๋๋ค.
์ผ์ชฝ ๊ทธ๋ฆผ์ ์ฌ์ดํด์ ํ์ฑํ ๊ทธ๋ํ์ ๊ทธ๋ฆผ์ ๋๋ค. ๊ทธ ๋ฐ๋ฉด ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ (Node - 1) ์ ๊ฐ์ ์ซ์๋ฅผ ๊ฐ์ง Spanning Tree ์ ๋๋ค. Spanning Tree ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋ฅ ์ธ์ดํด์ ์๋ง๋ค๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ธ์ดํด์ ์๋ง๋ ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ์ ์ ์์๊น์?
Union-find ์๊ณ ๋ฆฌ์ฆ. ์ด๋ฅผ ํ์ฉํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ์ธ์ดํด์ ์ฒดํฌํ ์ ์์ต๋๋ค. Union find ์๊ณ ๋ฆฌ์ฆ์ ํจ๊ณผ์ ์ผ๋ก ๊ทธ๋ฃน์ ํ์ฑ ํ๊ฒ ํด์ค๋๋ค. ์์ธํ ๊ฑด ์ ๊ฐ ์์ฑํ Union-find ์๊ณ ๋ฆฌ์ฆ์ ๋ด์ฃผ์ธ์. ๊ฐ์ ๊ทธ๋ฃน์ ์ํ๋ค๋ ๊ฒ์ ์ด๋ฏธ ์ฐ๊ฒฐ๋๋ค๋ ๊ฒ์ ๋ปํฉ๋๋ค. ๋ง์ฝ ๊ทธ๋ฐ๋ฐ ํ๋ฒ ๋ ์ฐ๊ฒฐํ๊ฒ ๋๋ฉด ์ธ์ดํด์ด ํ์ฑ๋๊ฒ ์ฃ . ๋ฐ๋ผ์ ๊ฐ์ ๊ทธ๋ฃน์ ์ํ๋ค๋ฉด ์ฐ๊ฒฐ์ ํ์ง ์๊ณ . ์ํ๊ฒ ์๋๋ผ๋ฉด ์์ง ์ฐ๊ฒฐ์ด ์๋๋ค๋ ๋ป์ด๋ ์ฐ๊ฒฐํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ Spanning Tree๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋ฉ๋๋ค.
์์ ๊ฐ์ค์น ์์๋๋ก ์ ์ ๋ค์ ์ฐ๊ฒฐํ๋. ์ธ์ดํด์ ํ์ธํ๋ฉด์ ์ฐ๊ฒฐํ๋ฉด. ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑ์ด์ MST ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ๋ฉ๋๋ค.
์์ ๋ฌธ์
์์ ๋ฌธ์ ๋ก๋ ๋ฐฑ์ค ๋ฌธ์ 10021 (Watering the fields) ๋ฅผ ๊ฐ๋ตํ ํด์ ํ์ด๋ณด๊ฒ ์ต๋๋ค.[[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8]] ๋ชจ๋๋ฅผ ์ต์๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ ๊ฐ์ ์ผ๋ง์ผ๊น์? ๊ฐ ๋ ธ๋ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ก ํ๊ฒ ์ต๋๋ค. ๋น์ฐํ sqrt(98) ์ผ ๊ฒ ์ ๋๋ค. ํ์ง๋ง ์ด๊ฑธ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก MST ๋ฅผ ๋ง๋ค์ด ํ์ด๋ณด๊ฒ ์ต๋๋ค.
import heapq
from math import sqrt
def find(par, uf_list):
if(uf_list[par] < 0): return par
else:
uf_list[par] = find(uf_list[par], uf_list)
return uf_list[par]
def union(f, t, uf_list):
from_ = find(f, uf_list)
to = find(t, uf_list)
if(from_ < to):
uf_list[to] = from_
else:
uf_list[from_] = to
def calc_Euclidean_distance(x1, y1, x2, y2):
x = x1 - x2
y = y1 - y2
return sqrt(x**2 + y**2)
fields = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8]]
node = 8
result = 0
hqueue = list()
uf_list = [-1] * 8
edge_count = 0
for i in range(node-1):
for j in range(node):
distance = calc_Euclidean_distance(fields[i][0], fields[i][1], fields[j][0], fields[j][1])
heapq.heappush(hqueue, (distance, i, j)) # ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํด์ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ์์๋๋ก ๊บผ๋ด๊ธฐ
while hqueue:
distance, from_, to = heapq.heappop(hqueue)
f = find(from_, uf_list)
t = find(to, uf_list)
if(f == t):
continue
union(from_, to, uf_list)
result += distance
edge_count += 1
print("minimum distance :", result) # sqrt(98) = 9.899494936611667
print("count of edges :", edge_count)
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํด์. ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ์์๋๋ก ์ฐจ๋ก๋๋ก ๊บผ๋ผ ์ ์๊ฒ ํ์ต๋๋ค. ๋๋จธ์ง๋ ์์์ ์ด๋ฏธ ์ค๋ช ํ๋ฏ์ด. Union-find ๋ฅผ ์ด์ฉํด ์ธ์ดํด์ ์ฒดํฌํ๊ณ ์ฐ๊ฒฐํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ง์น๋ฉด์
์ธ์ ๋ ํผ๋๋ฐฑ์ ํ์์ ๋๋ค. ๊ธด๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํน์ ์๊ณ ์ถ์ผ์ ์๊ณ ๋ฆฌ์ฆ์ด ์์ผ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์~~
'Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ : ๋ฐฑ์ค 11000๋ฒ - ๊ฐ์์ค ๋ฐฐ์ (0) | 2022.02.24 |
---|---|
Union find ์๊ณ ๋ฆฌ์ฆ - Python (0) | 2021.09.29 |