본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 16562 친구비

by Alan_Kim 2023. 4. 13.
728x90
반응형

https://www.acmicpc.net/problem/16562

 

16562번: 친구비

첫 줄에 학생 수 N (1 ≤ N ≤ 10,000)과 친구관계 수 M (0 ≤ M ≤ 10,000), 가지고 있는 돈 k (1 ≤ k ≤ 10,000,000)가 주어진다. 두번째 줄에 N개의 각각의 학생이 원하는 친구비 Ai가 주어진다. (1 ≤ Ai ≤ 10,

www.acmicpc.net

문제 해결

  • 결국 친구 사이클(network)를 만들어서 거기서 친구비 가장 작은 값을 더해주는 문제.
  • 즉 사이클과 그 사이클 안의 가장 작은 친구비를 구하면 된다.

 

CODE

import sys
input = sys.stdin.readline
INF = sys.maxsize
sys.setrecursionlimit(10**6)
def dfs(num):
    global money
    money = min(money, A[num])
    if len(graph[num])==0:
        return
    for go in graph[num]:
        if visited[go] ==False:
            visited[go] = True
            dfs(go)
if __name__=='__main__':
    n, m, k = map(int, input().split()) # 학생 수, 친구 관계수, 돈
    A = [0] + list(map(int, input().split())) # 친구 비
    graph = [[] for _ in range(n+1)]
    for _ in range(m):
        a, b = map(int, input().split())
        graph[a].append(b)
        graph[b].append(a)
    visited = [False]*(n+1)
    ans = 0
    for i in range(1,n+1):
        if not(visited[i]):
            visited[i] = True
            money = INF
            dfs(i)
            ans += money
    if k >= ans:
        print(ans)
    else:
        print("Oh no")
728x90
반응형

댓글