๋ฐ์ํ
๐ ํฌ๋ฃจ์ค์นผ(kruskal) ์ด๋
- ๊ฐ์ ์ ํ๋์ฉ ์ ํํด์ MST๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ( ํ๋ฆผ์ ์ ์ ์ ์ ํ, ํฌ๋ฃจ์ค์นผ์ ๊ฐ์ ์ ์ ํ )
- ์ต์ด ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
- ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ ํํ๋ฉด์ ํธ๋ฆฌ๋ฅผ ์ฆ๊ฐ์ํจ๋ค
- ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด ํจ์ฐ ( ์ฌ์ดํด์ ์กด์ฌ๋ฅผ ํ์ ํ๋๊ฒ ์ค์! )
- V-1๊ฐ์ ๊ฐ์ ์ด ์ ํ๋ ๋ ๊น์ง ๋ฐ๋ณต
- ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ
- disjoint-set ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ค.
๐ ํฌ๋ฃจ์ค์นผ(kruskal) ๊ตฌํ
def make_set(x):
p[x] = x
def find_set(x):
if p[x] == x:
return x
else:
p[x] = find_set(p[x])
return p[x]
def union(x, y):
px = find_set(x)
py = find_set(y)
if rank[px] > rank[py]:
p[py] = p[px]
elif rank[py] > rank[px]:
p[px] = p[py]
else:
p[px] = p[py]
rank[py] += 1
V, E = 7, 11
edges = [
[0, 5, 60],
[0, 1, 32],
[0, 2, 31],
[0, 6, 51],
[1, 2, 21],
[2, 4, 46],
[2, 6, 25],
[3, 4, 34],
[3, 5, 18],
[4, 5, 40],
[4, 6, 51],
]
# ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ค์น์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
edges.sort(key=lambda x: x[2])
# ๊ฐ ์ ์ ์ ๋ถ๋ชจ ์ ๋ณด, Rank ์ ๋ณด(ํจ์จ์ฑ)
p = [0] * V
rank = [0] * V
# ๊ฐ ์ ์ ์ ๋ถ๋ชจ๋ฅผ ์์ ์ผ๋ก ์ค์ ํ๊ธฐ
for i in range(V):
make_set(i)
# ๊ฐ์ ์ ์ ํํ๋ ๊ฐ์๋ V-1๊ฐ, ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๋์ ํ ๊ฒฐ๊ณผ๊ฐ
cnt = 0
result = 0
for i in range(E):
s, e, c = edges[i]
# s์ e๊ฐ ๊ฐ์ ์งํฉ์ด๋ฉด( ์ฌ์ดํด์ด๋ฉด ) ํจ์ฐ
if find_set(s) == find_set(e):
continue
# ๊ฐ์ค์น๋ฅผ ๋ํ๊ณ
result += c
# s์ e๋ฅผ ๊ฐ์ ์งํฉ์ผ๋ก ๋ง๋ ๋ค
union(s, e)
# ๊ฐ์ ์ V-1๊ฐ ์ ํํ์ผ๋ฉด ๋
cnt += 1
if cnt == V - 1:
break
print(result)
๋ฐ์ํ
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ค์ต์คํธ๋ผ(dijkstra) (0) | 2020.10.02 |
---|---|
๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2020.10.01 |
์๋ก์ ์งํฉ(Disjoint-set) (0) | 2020.09.29 |
๊น์ด ์ฐ์ ํ์(Depth First Search, DFS) (0) | 2020.09.28 |
๋๋น ์ฐ์ ํ์(Breath First Search, BFS) (0) | 2020.09.27 |