Pagini recente » Cod sursa (job #1964702) | Cod sursa (job #1365431) | Cod sursa (job #824776) | Cod sursa (job #2260922) | Cod sursa (job #1723734)
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 16005
#define INFI 0x3f3f3f
vector < int > v[ NMAX ];
int vizt[ NMAX ];
int nodVal[ NMAX ];
int bestNod[ NMAX ];
int maxim( int a, int b ){
if( a > b ) return a;
return b;
}
void dfs( int x ){
int n, i, nodCopil, subArbore;
if( vizt[ x ] ) return ;
vizt[ x ] = 1;
subArbore = 0;
n = v[ x ].size();
for( i = 0; i < n; ++i){
nodCopil = v[ x ][ i ];
if( vizt[ nodCopil ] == 0 ){
dfs( nodCopil );
if( bestNod[ nodCopil ] > 0 ) subArbore += bestNod[ nodCopil ];
}
}
bestNod[ x ] = nodVal[ x ] + subArbore;
}
int main()
{
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
int n, m, i, j, s, t, x, y, maxi;
scanf("%d",&n);
for( i = 1; i <= n; ++i ) scanf("%d",&nodVal[ i ]);
m = n;
while( --m ){
scanf("%d%d",&x,&y);
v[ x ].push_back( y );
v[ y ].push_back( x );
}
dfs( 1 );
maxi = -INFI;
for( i = 1; i <= n; ++i)
maxi = maxim( maxi, bestNod[ i ] );
printf("%d\n",maxi);
return 0;
}