Pagini recente » Cod sursa (job #2413531) | Cod sursa (job #1635909) | Cod sursa (job #2868202) | Cod sursa (job #1178330) | Cod sursa (job #1247378)
#include <cstdio>
#include <vector>
using namespace std;
const int N = 16010;
int n, maxim = -1;
vector <int> graph [N];
int v [N], s [N];
bool used [N], used2 [N];
void dfs (int x) {
vector <int> :: iterator it;
used [x] = 1;
s [x] = v [x];
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (!used [*it]) {
dfs (*it);
if (s [*it] > 0)
s [x] += s [*it];
}
if (s [x] > maxim)
maxim = s [x];
}
void dfs2 (int x) {
int a, b, root, son;
vector <int> :: iterator it;
used2 [x] = 1;
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (!used2 [*it]) {
root = s [x];
son = s [*it];
a = s [x];
if (s [*it] > 0)
a -= s [*it];
b = s [*it];
if (a > 0)
b = s [*it] + a;
s [x] = a;
s [*it] = b;
dfs2 (*it);
s [x] = root;
s [*it] = son;
}
if (s [x] > maxim)
maxim = s [x];
}
int main () {
int i, x, y;
freopen ("asmax.in", "r", stdin);
freopen ("asmax.out", "w", stdout);
scanf ("%d", &n);
maxim = -((1ll << 31) - 1);
for (i = 1; i <= n; i ++)
scanf ("%d", &v [i]);
for (i = 1; i < n; i ++) {
scanf ("%d%d", &x, &y);
graph [x].push_back (y);
graph [y].push_back (x);
}
dfs (1);
dfs2 (1);
printf ("%d\n", maxim);
return 0;
}