Pagini recente » Cod sursa (job #2152610) | Cod sursa (job #2489995) | Cod sursa (job #896960) | Cod sursa (job #1849210) | Cod sursa (job #1442761)
//0120
#include <cstdio>
#include <list>
#define li list<int>::iterator
#define VM -16000000
using namespace std;
list<int> e[16000];
int v[16000];
long dp[16000][16000];
bool alese[16000];
long arb(int nod, int rad) {
long ans = v[nod];
if (rad != -1 && dp[nod][rad] != VM)
return dp[nod][rad];
for (li it = e[nod].begin(); it != e[nod].end(); it++)
if (*it != rad) {
long aux = arb(*it, nod);
ans += (aux >= 0) ? aux : 0;
alese[*it] = (aux >= 0);
}
if (rad != -1)
dp[nod][rad] = ans;
return ans;
}
int main() {
FILE* fi = fopen("asmax.in", "rt");
FILE* fo = fopen("asmax.out", "wt");
int n;
fscanf(fi, "%d", &n);
for (int i = 0; i < n; i++)
fscanf(fi, "%d", &v[i]);
for (int i = 1; i < n; i++) {
int a, b;
fscanf(fi, "%d%d", &a, &b);
a--; b--;
e[a].push_back(b);
e[b].push_back(a);
}
for (int i = 0; i < n; i++) {
alese[i] = false;
for (int j = 0; j < n; j++)
dp[i][j] = VM;
}
long minim = VM;
for (int i = 0; i < n; i++) {
if (alese[i])
continue;
long val = arb(i, -1);
alese[i] = true;
if (val > minim)
minim = val;
}
fprintf(fo, "%ld", minim);
return 0;
}