[파이썬] 백준 16562번 친구비
작성:
백준 #16562 친구비
# k라는 예산 안에서 친구에게 돈을 주어 모든 학생을 친구로 만든다.
# 출력: 모든 학생을 친구로 만들 수 있는 최소비용
# 불가능하면 Oh no 출력
# 모든 학생과 친구가 되어야 한다.
# = 연결된 누군가와는 친구가 되어야 한다.
# 그 연결된 누군가는 최소비용을 가지고 있어야 한다.
# 1. 친구비를 낮은 순으로 정렬한다.
# 2. 그 친구를 매수하고 연결된 모든 친구는 친구라고 한다.
# 친구비, 인덱스 배열 people
# 친구관계 나타내는 배열 rel
# 친구 체크되었는지 확인하는 배열 check
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
def update(idx):
global left
for p in rel[idx]:
if not check[p]:
check[p] = 1
left -= 1
update(p)
N, M, k = map(int, input().split())
people = [[0, i] for i in range(N+1)]
rel = [[] for i in range(N+1)]
check = [0 for i in range(N+1)]
left = N
init_k = k
inp = list(map(int, input().split()))
for i in range(len(inp)):
people[i+1][0] = inp[i]
for i in range(M):
a, b = map(int, input().split())
rel[a].append(b)
rel[b].append(a)
people.sort()
for i in range(1, N+1):
price, idx = people[i]
if not left or k < price: break
if not check[idx]:
check[idx] = 1
left -= 1
k -= price
update(idx)
if left: print('Oh no')
else: print(init_k - k)
댓글남기기