Pagini recente » Cod sursa (job #2380482) | Cod sursa (job #1751756) | Rating Stapanu Stapanilor (StapanuBarosanu) | Cod sursa (job #3282933) | Cod sursa (job #1661373)
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODURI 16000
#define NECALCULAT -1000000000
int din[ MAX_NODURI ] , v[ MAX_NODURI ];
struct LAdiacenta {
int* vec;
int top;
int size;
}liste[ MAX_NODURI ];
void alocare( struct LAdiacenta *n ) {
int *vechi;
int i;
n -> size = n -> size * 2;
vechi = n -> vec;
n -> vec = ( int* )malloc( sizeof( int ) * n -> size );
for( i = 0 ; i < n -> size / 2 ; i++ )
n -> vec[ i ] = vechi[ i ];
}
void add( struct LAdiacenta *n , int x ) {
if( n -> top == n -> size )
alocare( n );
n -> vec[ n -> top ] = x;
n -> top++;
}
void init( struct LAdiacenta *n ) {
n -> top = 0;
n -> size = 1;
n -> vec = ( int* )malloc( sizeof( int ) );
}
//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 tata ) {
//daca suma nu este calculata o calculam
if( din[ varf ] == NECALCULAT ) {
int i;
//includ si nodul curent
din[ varf ] = v[ varf ];
for( i = 0 ; i < liste[ varf ].top ; i++ )
if( liste[ varf ].vec[ i ] != tata )
din[ varf ] += max( 0 , asmax( liste[ varf ].vec[ i ] , varf ) );
}
return din[ varf ];
}
int main() {
int n , i , rez , a , b;
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;
init( &liste[ i ] );
}
//citim muchiile
for( i = 0 ; i < n - 1 ; i++ ) {
fscanf( fin , "%d%d" , &a , &b );
a--;
b--;
add( &liste[ a ] , b );
add( &liste[ b ] , a );
}
fclose( fin );
//cautam suma maxima
rez = NECALCULAT;
for( i = 0 ; i < n ; i++ )
rez = max( rez , asmax( i , -1 ) );
FILE *fout = fopen( "asmax.out" , "w" );
fprintf( fout , "%d" , rez );
fclose( fout );
return 0;
}