백준 1949 - 우수 마을 (파이썬)

Updated:

dp에서 0이면 자기자신이 우수 마을인 경우라 생각하고 풀면됩니다.

import sys

sys.setrecursionlimit(10**9)
input = sys.stdin.readline

n = int(input())
costs = [0] + list(map(int, input().split()))
graph = [[] for _ in range(n + 1)]
visited = [False] * (n + 1)

for _ in range(n - 1):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)

dp = [[0, 0] for _ in range(n + 1)]

def dfs(num):
    visited[num] = True
    dp[num][0] = costs[num]
    
    for i in graph[num]:
        if not visited[i]:
            dfs(i)
            dp[num][0] += dp[i][1]
            dp[num][1] += max(dp[i][0], dp[i][1])

dfs(1)
print(max(dp[1][0], dp[1][1]))

Categories:

Updated: