Pagini recente » Cod sursa (job #1646780) | Cod sursa (job #1391740) | Cod sursa (job #1674832) | Cod sursa (job #1934658) | Cod sursa (job #1468221)
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int n, i, v, s, e;
typedef struct nod {
long int val;
struct nod *c;
struct nod *s;
} nod;
nod *nodes[16001];
unsigned int gsum = INT_MIN;
inline int max(int a, int b) {
return a > b ? a : b;
}
unsigned long long solve(nod *root) {
int ms = 0;
if (root == NULL) return 0;
nod *c = root->c;
while (c) {
ms += max(solve(c), 0);
c = c->s;
}
gsum = max(ms + root->val, gsum);
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;
nodes[i] = x;
}
for(i = 1; i < n; i++) {
scanf("%d %d", &s, &e);
nodes[e]->s = nodes[s]->c;
nodes[s]->c = nodes[e];
esum += e;
}
solve(nodes[(n * (n + 1))/2 - esum]);
printf("%d\n", gsum);
fclose(fi);
fclose(fo);
return 0;
}