[BOJ][๐ก4][๋ฐฑ์ค#01197] ์ต์ ์คํจ๋ ํธ๋ฆฌ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ๊ทธ๋ํ์ ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ต์ ์คํจ๋ ํธ๋ฆฌ๋, ์ฃผ์ด์ง ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ๋ค์ ์ฐ๊ฒฐํ๋ ๋ถ๋ถ ๊ทธ๋ํ ์ค์์ ๊ทธ ๊ฐ์ค์น์ ํฉ์ด ์ต์์ธ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V(1 โค V โค 10,000)์ ๊ฐ์ ์ ๊ฐ์ E(1 โค E โค 100,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ E๊ฐ์ ์ค์๋ ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ์ ์ ๊ณผ B๋ฒ ์ ์ ์ด ๊ฐ์ค์น C์ธ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์๋ฏธ์ด๋ค. C๋ ์์์ผ ์๋ ์์ผ๋ฉฐ, ์ ๋๊ฐ์ด 1,000,000์ ๋์ง ์๋๋ค. ๊ทธ๋ํ์ ์ ์ ์ 1๋ฒ๋ถํฐ V๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๊ณ , ์์์ ๋ ์ ์ ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ์๋ค. ์ต์ ์คํจ๋ ํธ๋ฆฌ์ ๊ฐ์ค์น๊ฐย -2,147,483,648๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 2,147,483,647๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต์ ์คํจ๋ ํธ๋ฆฌ์ ๊ฐ์ค์น๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
3 3
1 2 1
2 3 2
1 3 3
์ถ๋ ฅ
3```
<br>
## My Sol
```python
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
def find_set(x):
global p
if x != p[x]:
p[x] = find_set(p[x])
return p[x]
def union(u, v, w):
global cnt, ret, p
a, b = find_set(u), find_set(v)
if a != b:
p[a] = b
ret += w
cnt += 1
V, E = map(int, input().split())
Q = []
for _ in range(E):
u, v, w = map(int, input().split())
heappush(Q, (w, u, v))
p = [i for i in range(V+1)]
ret = 0
cnt = 0
while cnt < V-1:
w, u, v = heappop(Q)
union(u, v, w)
print(ret)
graph ์ด๋ก ์ ์ ๋์จ ํ์ธ๋์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํ์๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ์ฌ ํ ๊ณณ์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ชจ์๋ค.
- ๊ฐ์ค์น๊ฐ ์งง์ ์์๋๋ก ์ ๋ ฌํ๋ค. ๋๋ ์ฐ์ ์์ ํ(heap)๋ฅผ ์ฌ์ฉํ์๋ค.
- ํ๋ํ๋ ๋ฝ์์ ๋ ๋ ธ๋์ ๋ฃจํธ๋ ธ๋๊ฐ ๊ฐ์์ง ํ์ธํ๋ค.
- ๊ฐ๋ค๋ฉด ์ด๋ฏธ ๊ฐ์ค์น๊ฐ ๋ ์์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ด๋ฏ๋ก ๋์ด๊ฐ๋ค.
- ๊ฐ์ง ์๋ค๋ฉด ํด๋น ๊ฐ์ค์น๊ฐ ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ์์ ๊ฐ์ค์น์ ๊ฐ์ ์ด๋ค.
- ์ ๋์จ ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ค์น๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ ๋ํ๊ณ ์นด์ดํธ๋ฅผ 1 ์ฆ๊ฐ, ๋ ๋ ธ๋์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ฐ๊ฒ ์ด์ํด์ค๋ค.
- ์นด์ดํธ๊ฐ V-1, ์ฆ ๋ชจ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋๋ฉด ๋ฐ๋ณต์ ์ข ๋ฃํ๋ค.
- ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ค.
ํญ์ union ํจ์์์ p[a] = b ๋ถ๋ถ์ด ๋๋ฌด ํท๊ฐ๋ ธ๋ค. ์ด ๋ถ๋ถ์ ์ ์์งํ๋๋ก ํ์.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
from sys import stdin
read = stdin.readline
V, S = map(int, read().split())
edge = []
for _ in range(S):
a, b, w = map(int, read().split())
edge.append((w, a, b))
edge.sort(key=lambda x: x[0])
parent = list(range(V + 1))
def union(a, b):
a = find(a)
b = find(b)
if b < a:
parent[a] = b
else:
parent[b] = a
def find(a):
if a == parent[a]:
return a
parent[a] = find(parent[a]) # ๊ฒฝ๋ก ์์ถ
return parent[a]
sum = 0
for w, s, e in edge:
if find(s) != find(e):
union(s, e)
sum += w
print(sum)
์ฐ์ฐ์๋๊ฐ 20% ์ ๋ ๋น ๋ฅธ ํ์ด๋ฅผ ๋ฐ๊ฒฌํด์ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ด ์ฝ๋๋ ํน๋ณํ ๋ค๋ฅธ ๋ถ๋ถ์ ์๊ณ , ๋๋ heap์ ์ด์ฉํ์ง๋ง ์ด ๋ถ์ list๋ก ์ ๋ ฅ์ ์ฒ๋ฆฌํ ๋ค, ํ ๋ฒ์ sort๋ฅผ ์ด์ฉํด ๊ฐ์ค์น๋ณ๋ก ์ ๋ ฌํ์ จ๋ค.
๊ทธ๋ฐ๋ฐ ์กฐ๊ธ ๋ค๋ฅด๋ค๊ณ ๋๋ ์ ์ union์์ a์ b์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ ๋ ์์ ๋ฃจํธ ๋ ธ๋ ๋ฒํธ๋ก ๊ฐฑ์ ๋๋๋ก ํ๋ค๋ ์ ์ด ํน์ดํ๋ค. ์ด์ฐจํผ ๊ฐ์์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ์๋ฏธ๊ฐ ์์ง ์์๊ฐ?
heap์ด ๋ ๋น ๋ฅด๋ค๊ณ ์๊ฐํ๋๋ฐ list์ ์ ๋ ฌ ๋ฐฉ์์ด ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ผ๋ ์ ์ด ์ฐ์ฐ์๋์ ๊ฒฐ์ ์ ์์ธ์ด๋ผ๊ณ ๋๊ผ๊ณ , ์ด ๋๋ฌธ์ ๋ด ํ์ด์์ list์ ์ ๋ ฌ์ ์ฌ์ฉํด ๋ค์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ค.
import sys
input = sys.stdin.readline
def find_set(x):
global p
if x != p[x]:
p[x] = find_set(p[x])
return p[x]
def union(u, v, w):
global cnt, ret, p
a, b = find_set(u), find_set(v)
if a != b:
p[a] = b
ret += w
cnt += 1
V, E = map(int, input().split())
Q = []
for _ in range(E):
u, v, w = map(int, input().split())
Q.append((w, u, v))
Q.sort()
p = [i for i in range(V+1)]
ret = 0
cnt = 0
i = 0
while cnt < V-1:
w, u, v = Q[i]
union(u, v, w)
i += 1
print(ret)
์ฐ์ฐ์๋๊ฐ 480ms์์ 380ms๋ก 20% ์ ๋ ๊ฐ์ํ์๋ค. ์ญ์ heap์ด ๋ฌธ์ ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ