백준 2213 - 트리의 독립집합 (파이썬)

Updated:

각각의 정점들에 대하여 자신을 포함했을때의 최댓값과 포함하지 않았을때의 최댓값을 동적 프로그래밍을 사용하여 풀었습니다.

import sys

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

n = int(input())
values = [0] + list(map(int, input().split()))
tree = [[] for _ in range(n + 1)]
dp = [[0, 0] for _ in range(n + 1)]
num = [[[], []] for _ in range(n + 1)]

for _ in range(n - 1):
    U, V = map(int, input().split())
    tree[U].append(V)
    tree[V].append(U)

visited = [0] * (n + 1)

def dfs(now):
    visited[now] = 1
    dp[now][0] = values[now]
    num[now][0].append(now)
    
    for next in tree[now]:
        if visited[next] == 0:
            dfs(next)
            dp[now][0] += dp[next][1]
            
            for i in num[next][1]:
                num[now][0].append(i)
                
            if dp[next][0] <= dp[next][1]:
                dp[now][1] += dp[next][1]
                
                for i in num[next][1]:
                    num[now][1].append(i)
            else:
                dp[now][1] += dp[next][0]
                
                for i in num[next][0]:
                    num[now][1].append(i)

dfs(1)

if dp[1][0] >= dp[1][1]:
    i = 0
else:
    i = 1

print(dp[1][i])

tmp = num[1][i]
tmp.sort()
print(*tmp)

Categories:

Updated: