반응형

 

<코드>

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int N, a, b;
int citizen[10001];
int dp[10001][2];
bool visit[10001];
vector<int> v[10001];

void DFS(int now) // 현재, 합계, 우수마을여부
{
	visit[now] = true;

	dp[now][0] = 0;
	dp[now][1] = citizen[now];

	for (int next : v[now])
	{
		if (!visit[next])
		{
			DFS(next);

			// 현재마을 != 우수마을 이라면 다음마을은 우수마을이거나 우수마을이 아님
			dp[now][0] += max(dp[next][0], dp[next][1]);

			// 현재마을 == 우수마을 이라면 다음마을은 우수마을이 아님
			dp[now][1] += dp[next][0];
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;

	for (int i = 1; i <= N; i++)
		cin >> citizen[i];

	for (int i = 1; i < N; i++)
	{
		cin >> a >> b;
		v[a].push_back(b);
		v[b].push_back(a);
	}

	DFS(1);

	cout << max(dp[1][0], dp[1][1]);

}

 

 

 

www.acmicpc.net/problem/1949

 

1949번: 우수 마을

N개의 마을로 이루어진 나라가 있다. 편의상 마을에는 1부터 N까지 번호가 붙어 있다고 하자. 이 나라는 트리(Tree) 구조로 이루어져 있다. 즉 마을과 마을 사이를 직접 잇는 N-1개의 길이 있으며,

www.acmicpc.net

 

반응형

+ Recent posts