Pagini recente » Cod sursa (job #1090783) | Cod sursa (job #1788997) | Cod sursa (job #2328258) | Cod sursa (job #3225719) | Cod sursa (job #2201297)
#include <stdio.h>
#define NMAX 16000
#define INF NMAX * 1000 + 1
int n, nr, val[1 + NMAX], lst[1 + NMAX], vf[1 + 2 * NMAX], viz[1 + 2 * NMAX], urm[1 + 2 * NMAX], maxim = -INF;
void adauga ( int x, int y ) {
++nr;
vf[nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
int dfs ( int x ) {
viz[x] = 1;
int p = lst[x], y;
int sum = val[x];
while ( p != 0 ) {
y = vf[p];
if ( !viz[y] ) {
int d = dfs ( y );
sum += ( d > 0 ) * d;
}
p = urm[p];
}
if ( sum > maxim )
maxim = sum;
return sum;
}
int main() {
FILE *fin = fopen ( "asmax.in", "r" );
fscanf ( fin, "%d", &n );
int i;
for ( i = 1; i <= n; ++i )
fscanf ( fin, "%d", &val[i] );
int x, y;
for ( i = 1; i < n; ++i ) {
fscanf ( fin, "%d%d", &x, &y );
adauga ( y, x );
adauga ( x, y );
}
fclose ( fin );
dfs ( 1 );
FILE *fout = fopen ( "asmax.out", "w" );
fprintf ( fout, "%d", maxim );
fclose ( fout );
return 0;
}