Pagini recente » Cod sursa (job #1064808) | Cod sursa (job #1588703) | Cod sursa (job #498988) | Cod sursa (job #706686) | Cod sursa (job #1468215)
#include <stdio.h>
#include <stdlib.h>
int n, i, v, s, e;
typedef struct nod {
long int val;
int index;
struct nod *child;
struct nod *sibling;
} nod;
nod *nodes[16001];
inline int max(int a, int b) {
return a > b ? a : b;
}
unsigned long long solve(nod *root) {
int i = 0, j;
int sums[16000];
int ms = 0;
if (root == NULL) return 0;
nod *c = root->child;
while (c) {
sums[i++] = solve(c);
c = c->sibling;
}
for (j = 0; j < i; j++) {
ms += max(sums[j], 0);
}
return max(ms + root->val, 0);
}
int main() {
nod *x;
unsigned int esum = 0;
FILE *fi, *fo;
fi = freopen("asmax.in", "r", stdin);
fo = freopen("asmax.out", "w", stdout);
scanf("%d", &n);
for(i=1;i<=n;i++) {
scanf("%d", &v);
x = (nod*) malloc(sizeof(nod));
x->val = v;
x->index = i;
nodes[i] = x;
}
for(i = 1; i < n; i++) {
scanf("%d %d", &s, &e);
nodes[e]->sibling = nodes[s]->child;
nodes[s]->child = nodes[e];
esum += e;
}
printf("%llu\n", solve(nodes[(n * (n + 1))/2 - esum]));
fclose(fi);
fclose(fo);
return 0;
}