Pagini recente » Cod sursa (job #2101307) | Cod sursa (job #2592516) | Cod sursa (job #1313086) | Cod sursa (job #1964711) | Cod sursa (job #1212201)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int dp[16001][2];
int V[16001];
vector<int> G[16001];
// Solve for subtree (node, parent) given that the solution is_started.
int solve(int node, int parent, int is_started) {
if (dp[node][is_started]) return dp[node][is_started] - 1;
int ret = 0;
int started = V[node];
for (int i = 0; i < G[node].size(); ++i) {
int node2 = G[node][i];
if (node2 == parent) continue;
if (!is_started) ret = max(ret, solve(node2, node, 0));
started += solve(node2, node, 1);
}
ret = max(ret, started);
dp[node][is_started] = ret + 1;
return ret;
}
int N;
int main() {
freopen("asmax.in", "r", stdin);
freopen("asmax.out", "w", stdout);
scanf("%d", &N);
for (int i = 1; i <= N; ++i) scanf("%d", &V[i]);
for (int i = 1; i < N; ++i) {
int a, b; scanf("%d %d", &a, &b);
G[a].push_back(b);
G[b].push_back(a);
}
int ret = solve(1, -1, 0);
if (ret == 0) {
int best = -1000;
for (int i = 1; i <= N; ++i) best = max(best, V[i]);
ret = best;
}
printf("%d\n", ret);
return 0;
}