https://www.acmicpc.net/problem/16562
๋ฌธ์
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โ(๋ฐ์ดํ ์ ๊ฑฐ)๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ฝ๋
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
def find(n):
if parent[n] == n:
return n
parent[n] = find(parent[n])
return parent[n]
def union(a,b):
a,b = find(a),find(b)
# ์น๊ตฌ ๋น์ฉ์ด ๋ฎ์ ์ชฝ์ผ๋ก ํฉ์ณ์ค
if price[a] < price[b]:
parent[b] = a
else:
parent[a] = b
N,M,charge = map(int,input().split())
price = [0] + list(map(int,input().split()))
parent = [i for i in range(N+1)]
# ์น๊ตฌ ๊ด๊ณ๋ฅผ ํตํด ์งํฉ ํ์ฑ
for _ in range(M):
n1,n2 = map(int,input().split())
union(n1,n2)
# ์น๊ตฌ ๋น์ฉ์ ์ง๋ถํด์ผ ํ๋ ์งํฉ๋ง ๋ํด์ค
res = 0
set_lst = [find(p) for p in parent[1:]]
set_lst = list(set(set_lst))
for p in set_lst:
res += price[p]
# ๋ชจ๋ ํ์์ ์น๊ตฌ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ
if charge >= res:
print(res)
# ๋ค ์ฌ๊ท ์ ์๋ ๊ฒฝ์ฐ
else:
print("Oh no")
์ ๋ ฅ๋ฐ์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ํตํด์ ์ฐ์ ๊ทธ๋ฃน์ ํ์ฑํด์ค๋ค.
# ์น๊ตฌ ๊ด๊ณ๋ฅผ ํตํด ์งํฉ ํ์ฑ
for _ in range(M):
n1,n2 = map(int,input().split())
union(n1,n2)
union
์ ์งํํ ๋, ์น๊ตฌ ๋น์ฉ์ ์ต์ํํ๊ธฐ ์ํด์ ๋น์ฉ์ด ์ ์ ์น๊ตฌ์ชฝ์ผ๋ก ๊ทธ๋ฃน์ ํฉ์น๋ค.# ์น๊ตฌ ๋น์ฉ์ด ๋ฎ์ ์ชฝ์ผ๋ก ํฉ์ณ์ค
if price[a] < price[b]:
parent[b] = a
else:
parent[a] = b
๋ชจ๋ ์น๊ตฌ๋ค๊ณผ ์น๊ตฌ๊ฐ ๋๊ธฐ ์ํด์๋, ํ์ฑ๋ ๋ชจ๋ ์น๊ตฌ ๊ทธ๋ฃน์๊ฒ ๋น์ฉ์ ์ง๋ถํด์ผํ๋ค.
find
์ set
์ ํ์ฉํด ๊ทธ๋ฃน๋ง ๋จ๊ฒจ์ค๋ค.
res
์ ์ง๋ถํด์ผํ๋ ์น๊ตฌ ๋น์ฉ์ ๋ํด์ค๋ค.
# ์น๊ตฌ ๋น์ฉ์ ์ง๋ถํด์ผ ํ๋ ์งํฉ๋ง ๋ํด์ค
res = 0
set_lst = [find(p) for p in parent[1:]]
set_lst = list(set(set_lst))
for p in set_lst:
res += price[p]
๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๋ต์ ์ถ๋ ฅํ๋ค.
charge
๊ฐ res
์ด์์ด๋ผ๋ฉด, ๋ชจ๋์ ์น๊ตฌ๊ฐ ๋ ์ ์๋ค.# ๋ชจ๋ ํ์์ ์น๊ตฌ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ
if charge >= res:
print(res)
# ๋ค ์ฌ๊ท ์ ์๋ ๊ฒฝ์ฐ
else:
print("Oh no")
๋๋ ์ & ๋ฐฐ์ด ์