|
| 1 | + |
| 2 | +#include <iostream> |
| 3 | +#include <algorithm> |
| 4 | +#include <vector> |
| 5 | +#define MAX 10001 |
| 6 | + |
| 7 | +using namespace std; |
| 8 | + |
| 9 | +int town[MAX]; |
| 10 | +vector<int> map[MAX]; |
| 11 | +bool visit[MAX]; |
| 12 | +int N = 0; |
| 13 | +int dp[MAX][2]; |
| 14 | +// dp[i][0] = 우수마을 아닐 때 주민 수 |
| 15 | +// dp[i][1] = 우수마을일 때 주민 수 |
| 16 | + |
| 17 | +void dfs(int now_){ |
| 18 | + |
| 19 | + visit[now_] = true; |
| 20 | + dp[now_][0] = 0; |
| 21 | + dp[now_][1] = town[now_]; |
| 22 | + |
| 23 | + // 인접한 마을 찾기 |
| 24 | + for(int i = 0 ; i < map[now_].size(); i++){ |
| 25 | + int next = map[now_][i]; |
| 26 | + if(!visit[next]){ |
| 27 | + dfs(next); |
| 28 | + dp[now_][0] += max(dp[next][0], dp[next][1]); // 우수마을이 아닐 때, 인접 마을은 우수마을이거나 아닐 수 있음 |
| 29 | + dp[now_][1] += dp[next][0]; // 우수마을 일 때, 인접 마을은 우수마을이 될 수 없음 |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | +} |
| 36 | + |
| 37 | +void draw_map(){ |
| 38 | + |
| 39 | + cin >> N; |
| 40 | + for(int i = 1 ; i <= N ; i++){ |
| 41 | + cin >> town[i] ; |
| 42 | + visit[i] = false; |
| 43 | + } |
| 44 | + |
| 45 | + for(int i = 1 ; i < N ; i++){ |
| 46 | + int u = 0, v = 0; |
| 47 | + cin >> u >> v ; |
| 48 | + map[u].push_back(v); |
| 49 | + map[v].push_back(u); |
| 50 | + } |
| 51 | + |
| 52 | + |
| 53 | +} |
| 54 | +int main(){ |
| 55 | + draw_map(); |
| 56 | + dfs(1); |
| 57 | + cout << max(dp[1][0], dp[1][1]) << endl; |
| 58 | +} |
0 commit comments