Pagini recente » Cod sursa (job #1821075) | Cod sursa (job #1599498) | Cod sursa (job #3184534) | Cod sursa (job #2621776) | Cod sursa (job #1415599)
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODURI 16000
#define VAL_MAX 1000
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
typedef struct Graf {
int nod;
struct Graf* next;
} Graf;
Graf *G[MAX_NODURI];
int suma[MAX_NODURI], vizitat[MAX_NODURI], val[MAX_NODURI];
int maxim = -VAL_MAX;
void adauga(int a, int b) {
Graf *p = malloc(sizeof(Graf));
p -> nod = b;
p -> next = G[a];
G[a] = p;
}
void citire(FILE *in, int n) {
int i;
for (i = 0; i < n; i++) {
fscanf(in, "%d", &val[i]);
}
int a, b;
for (i = 1; i <= n - 1; i++) {
fscanf(in, "%d %d", &a, &b);
adauga(a - 1, b - 1);
adauga(b - 1, a - 1);
}
}
void sumaDFS(int nod) {
vizitat[nod] = 1;
suma[nod] = val[nod];
Graf *p;
for (p = G[nod]; p != NULL; p = p -> next)
if (!vizitat[p -> nod]) {
sumaDFS(p -> nod);
if (suma[p -> nod] > 0)
suma[nod] += suma[p -> nod];
}
maxim = MAX(maxim, suma[nod]);
}
int main() {
FILE *in = fopen("asmax.in", "r");
FILE *out = fopen("asmax.out", "w");
int n;
fscanf(in, "%d", &n);
citire(in, n);
sumaDFS(0);
fprintf(out, "%d", maxim);
fclose(in);
fclose(out);
return 0;
}