BOJ 1949 우수 마을

Jmnote (토론 | 기여)님의 2024년 1월 4일 (목) 02:00 판 (새 문서: ==개요== {{BOJ | 단계 = 38 | 분류1 = 다이나믹 프로그래밍 | 분류2 = 트리 | 분류3 = 트리에서의 다이나믹 프로그래밍 }} ==C++== <syntaxhighlight lang='...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

1 개요[ | ]

BOJ 1949 우수 마을

2 C++[ | ]

#include <bits/stdc++.h>
using namespace std;

int N;
vector<int> cnt;
vector<int> node[10001];
bool visited[10001] = {};
int dp[2][10001] = {};

void dfs(int cur) {
	if (visited[cur]) return;
	visited[cur] = true;
	dp[0][cur] = 0;
	dp[1][cur] = cnt[cur];
	for (int next : node[cur]) {
		if (visited[next]) continue;
		dfs(next);
		dp[0][cur] += max(dp[0][next], dp[1][next]);
		dp[1][cur] += dp[0][next];
	}
}

void solve() {
	dfs(1);
	cout << (max(dp[0][1], dp[1][1]));
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N;
	cnt.push_back(0);
	int a, b;
	for (int i=0; i<N; i++) {
		cin >> a;
		cnt.push_back(a);
	}
	for (int i=0; i<N; i++) {
		cin >> a >> b;
		node[a].push_back(b);
		node[b].push_back(a);
	}
	solve();
}