Pagini recente » Cod sursa (job #1220032) | Cod sursa (job #1469824) | Cod sursa (job #992255) | Cod sursa (job #416596) | Cod sursa (job #1468263)
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int n, i, v, s, e;
typedef struct nod {
long int v;
int i;
} nod;
typedef struct chld {
int e;
struct chld *n;
} chld;
nod **nodes;
chld *chlds[16001];
int *viz;
unsigned int gsum = INT_MIN;
inline int max(int a, int b) {
return a > b ? a : b;
}
unsigned long long solve(int i) {
int ms = 0;
if (nodes[i] == NULL) return 0;
chld *c = chlds[i];
while (c) {
if (viz[c->e] == 0) {
viz[c->e] = 1;
ms += max(solve(c->e), 0);
}
c = c->n;
}
gsum = max(ms + nodes[i]->v, gsum);
return max(ms + nodes[i]->v, 0);
}
int main() {
nod *x;
chld *ch;
FILE *fi, *fo;
fi = freopen("asmax.in", "r", stdin);
fo = freopen("asmax.out", "w", stdout);
scanf("%d", &n);
nodes = (nod**) malloc(sizeof(nod*) * (n+1));
viz = (int*) malloc(sizeof(int) * (n+1));
for(i=1;i<=n;i++) {
scanf("%d", &v);
x = (nod*) malloc(sizeof(nod));
x->i = i;
x->v = v;
nodes[i] = x;
}
for(i = 1; i < n; i++) {
scanf("%d %d", &s, &e);
ch = (chld*) malloc(sizeof(chld));
ch->e = e;
ch->n = chlds[s];
chlds[s] = ch;
ch = (chld*) malloc(sizeof(chld));
ch->e = s;
ch->n = chlds[e];
chlds[e] = ch;
}
solve(1);
printf("%d\n", gsum);
fclose(fi);
fclose(fo);
return 0;
}