[Python] G4_16562_์นœ๊ตฌ๋น„๐Ÿ˜ฅ

Sangho Hanยท2023๋…„ 8์›” 12์ผ
0
post-thumbnail

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")

๋А๋‚€ ์  & ๋ฐฐ์šด ์ 

  1. ์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด์„œ, ๋ฌด์กฐ๊ฑด ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ž‘์€ ์ชฝ์œผ๋กœ๋งŒ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ง€๊ธˆ์ฒ˜๋Ÿผ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ๊ทธ๋ฃน์„ ํ•ฉ์ณ์ฃผ์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€