[BOJ][๐ก4][๋ฐฑ์ค#16562] ์น๊ตฌ๋น
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
19ํ๋ฒ ์ด์ค์์ ํ์์ด N๋ช ์ธ ํ๊ต์ ์ ํ์ ํ๋ค. ์ค์์ด๋ ์ ํ์ ๋ง์ ๋ชจ๋ ํ์๊ณผ ์น๊ตฌ๊ฐ ๋๊ณ ์ถ์ดํ๋ค. ํ์ง๋ง ์ค์์ด๋ ํ์ ์ปดํจํฐ๋๋ง ๋ํ๋ฅผ ํ๋ฉฐ ์ด์์๊ธฐ ๋๋ฌธ์ ์ฌ๋๊ณผ ๋ง์ ํ๋ ๋ฒ์ ๋ชจ๋ฅธ๋ค. ๊ทธ๋ฐ ์ค์์ด์๊ฒ๋ ํฌ๋ง์ด ์๋ค. ๋ฐ๋ก ์น๊ตฌ๋น๋ค! ํ์ i์๊ฒ Ai๋งํผ์ ๋์ ์ฃผ๋ฉด ๊ทธ ํ์์ 1๋ฌ๊ฐ ์น๊ตฌ๊ฐ ๋์ด์ค๋ค! ์ค์์ด์๊ฒ๋ ์ด k์์ ๋์ด ์๊ณ ๊ทธ ๋์ ์ด์ฉํด์ ์น๊ตฌ๋ฅผ ์ฌ๊ท๊ธฐ๋ก ํ๋ค. ๋ง์ ์น๊ตฌ๋ฅผ ์ฌ๊ท๋ค ๋ณด๋ฉด ๋์ด ๋ถ์กฑํด์ง ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค. ๊ทธ๋์ ์ค์์ด๋ โ์น๊ตฌ์ ์น๊ตฌ๋ ์น๊ตฌ๋คโ๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ๋ค. ์ค์์ด๋ ์ด์ ๋ชจ๋ ์น๊ตฌ์๊ฒ ๋์ ์ฃผ์ง ์์๋ ๋๋ค! ์์ ๊ฐ์ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ ๋, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ์ฌ๋๊ณผ ์น๊ตฌ๊ฐ ๋๋ ๋ฐฉ๋ฒ์ ๊ตฌํ๋ผ.
์ ๋ ฅ
์ฒซ ์ค์ ํ์ ์ Nย (1ย โค Nย โคย 10,000)๊ณผ ์น๊ตฌ๊ด๊ณ ์ Mย (0ย โคย Mย โคย 10,000), ๊ฐ์ง๊ณ ์๋ ๋ kย (1ย โคย kย โคย 10,000,000)๊ฐย ์ฃผ์ด์ง๋ค. ๋๋ฒ์งธ ์ค์ N๊ฐ์ย ๊ฐ๊ฐ์ ํ์์ด ์ํ๋ ์น๊ตฌ๋น Ai๊ฐ ์ฃผ์ด์ง๋ค. (1ย โคย Aiย โคย 10,000, 1ย โค iย โค N) ๋ค์ M๊ฐ์ ์ค์๋ ์ซ์ v, w๊ฐ ์ฃผ์ด์ง๋ค. ์ด๊ฒ์ ํ์ v์ ํ์ w๊ฐ ์๋ก ์น๊ตฌ๋ผ๋ ๋ป์ด๋ค.
์ถ๋ ฅ
์ค์์ด๊ฐ ๋ชจ๋ ํ์์ ์น๊ตฌ๋ก ๋ง๋ค ์ ์๋ค๋ฉด,ย ์น๊ตฌ๋ก ๋ง๋๋๋ฐ ๋๋ ์ต์๋น์ฉ์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ์น๊ตฌ๋ฅผ ๋ค ์ฌ๊ทย ์ ์๋ค๋ฉด, โOh noโ(๋ฐ์ดํ ์ ๊ฑฐ)๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
5 3 20
10 10 20 20 30
1 3
2 4
5 4
์ถ๋ ฅ
20
์์ 2
์ ๋ ฅ
5 3 10
10 10 20 20 30
1 3
2 4
5 4
์ถ๋ ฅ
Oh no
My Sol
import sys
input = sys.stdin.readline
from collections import deque
def bfs(i):
global v
Q = deque()
Q.append(i)
minMuch = much[i]
while Q:
u = Q.popleft()
minMuch = min(minMuch, much[u])
if v[u]: continue
v[u] = 1
for e in G[u]:
Q.append(e)
return minMuch
N, M, k = map(int, input().split())
much = [0]
much += list(map(int, input().split()))
G = [[] for _ in range(N+1)]
v = [0]*(N+1)
for _ in range(M):
s, e = map(int, input().split())
G[s].append(e)
G[e].append(s)
minSsum = 0
for i in range(1, N+1):
if not v[i]:
minSsum += bfs(i)
ans = minSsum if minSsum <= k else 'Oh no'
print(ans)
๊ทธ๋ํ๋ฅผ ์ด์ฉํ๋ ๋ฌธ์ ์ผ ๊ฒ ๊ฐ์๋ฐ, BFS๋ก๋ ํ ์ ์์ ๊ฒ ๊ฐ์์ ์ ํ์ด๋ธ ๊ฒ ๊ฐ๋ค. visit ๋ฐฐ์ด์ ๋๊ณ , 1๋ถํฐ N๊น์ง ์ํํ๋ฉฐ visit ์ฒดํฌ๊ฐ ๋์ด์์ง ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ค์ visit์ฒดํฌํด๊ฐ๋ฉฐ ์ต์ ์น๊ตฌ๋น๋ฅผ ๊ตฌํ๋ค. bfs๊ฐ ๋๋๋ฉด ์ ์ญ์์ ์ด ์ต์ ์น๊ตฌ๋น๋ฅผ ๋์ ํด๊ฐ๋ค.
์ ์ฒด bfs๋ฅผ ๋ชจ๋ ๋ง์น๋ฉด ์ด๋์ ๋์ ๊ฐ์ด ์ต์ ์น๊ตฌ๋น์ด๋ฉฐ, ์ด๋ฅผ k์ ๋น๊ตํด์ k๋ฅผ ๋์ง ์๋๋ค๋ฉด ๋์ ๊ฐ์ ์ถ๋ ฅํ๊ณ , k๋ฅผ ๋๊ธด๋ค๋ฉด ์ข ๋ฃํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10000)
def find(x):
if x != parent[x]:
parent[x] = find(parent[x])
return parent[x]
def union_(a, b):
a = find(a)
b = find(b)
if a == b:
return
parent[a] = b
arr[b] = min(arr[a], arr[b])
N, M, K = map(int, input().split())
parent = [i for i in range(N + 1)]
arr = [0] + list(map(int, input().split()))
for _ in range(M):
a, b = map(int, input().split())
union_(a, b)
ans = 0
for i in range(1, N + 1):
if parent[i] == i:
ans += arr[i]
if ans > K:
print('Oh no')
else:
print(ans)
์ ๋์จํ์ธ๋๋ฅผ ์ด์ฉํด ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ํ ๋ฃจํธ๋ ธ๋๋ก ๊ฐ์ฃผํ์ฌ ์ฒ์์ ์ด๊ธฐํํ์๋ฏ์ด parent๊ฐ ์ธ๋ฑ์ค ๊ทธ ์์ ์ธ ๊ฒฝ์ฐ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ ๋์จํ์ธ๋๋ฅผ ์คํํ๋ฉด ํด๋น ์ธ๋ฑ์ค์ ์น๊ตฌ๋น๋ฅผ ans์ ๋ํด์ค๋ค.
๊ฐ์ ์ ์ ๋ ฅ์ ๋ฐ์ ๋๋ง๋ค union์ ์งํํด ์๋ก์ ์งํฉ์ผ๋ก ๋ฌถ์ด์ฃผ๊ณ , ๊ทธ ๊ณผ์ ์์ ํด๋นํ๋ ๋ฃจํธ ๋ ธ๋ ์ธ๋ฑ์ค b๋ฅผ ์ธ๋ฑ์ค๋ก ํ๋ arr ๋ฐฐ์ด์ ์ต์๊ฐ์ ๊ฐฑ์ ํด์ค๋ค. ๋ถํ์ํ ์ค๋ณต ์กฐํ๋ฅผ ํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ BFS๋ณด๋ค๋ ์ฐ์ฐ์๋๊ฐ ๋ ๋น ๋ฅธ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ