Pagini recente » Cod sursa (job #3122795) | Cod sursa (job #3250385) | Cod sursa (job #2615792) | Cod sursa (job #1215242) | Cod sursa (job #1658788)
#include <stdio.h>
#define MAX_VARFURI 16000
#define NECALCULAT -1000000
#define INFINIT 1000000000
int v[ MAX_VARFURI ];
int din[ MAX_VARFURI ];
struct muchie {
int a , b;
} muchii[ MAX_VARFURI - 1 ];
//maximul dintre a si b
int max( int a , int b ) {
if( a > b )
return a;
else
return b;
}
//calculeaza subarborele maxim cu radacina in varf
int asmax( int varf , int n ) {
//daca suma nu este calculata o calculam
if( din[ varf ] == NECALCULAT ) {
int i , nod;
//includ si nodul curent
din[ varf ] = v[ varf ];
//iau fiecare copil al nodului curent si caut suma maxima in acel nod
//il adaug la suma daca este pozitiv
for( i = 0 ; i < n - 1 ; i++ )
if( muchii[ i ].a == varf || muchii[ i ].b == varf ) {
nod = muchii[ i ].a + muchii[ i ].b - varf;
muchii[ i ].a = muchii[ i ].b = -1;
din[ varf ] += max( 0 , asmax( nod , n ) );
}
}
return din[ varf ];
}
int main() {
int n , i , rez;
FILE *fin = fopen( "asmax.in" , "r" );
fscanf( fin , "%d" , &n );
//citim valorile din fiecare nod
for( i = 0 ; i < n ; i++ ) {
fscanf( fin , "%d" , &v[ i ] );
din[ i ] = NECALCULAT;
}
//citim muchiile
for( i = 0 ; i < n - 1 ; i++ ) {
fscanf( fin , "%d%d" , &muchii[ i ].a , &muchii[ i ].b );
muchii[ i ].a--;
muchii[ i ].b--;
}
fclose( fin );
//cautam suma maxima
rez = -INFINIT;
for( i = 0 ; i < n ; i++ )
rez = max( rez , asmax( i , n ) );
FILE *fout = fopen( "asmax.out" , "w" );
fprintf( fout , "%d" , rez );
fclose( fout );
return 0;
}