Pagini recente » Cod sursa (job #1872869) | Cod sursa (job #2055885) | Cod sursa (job #1785447) | Cod sursa (job #1498577) | Cod sursa (job #2669755)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 16e3 + 1;
const int INF = 1e9;
vector <int> edges[NMAX];
int v[NMAX];
int viz[NMAX];
int dp[NMAX];
void init() {
for ( int i = 1; i < NMAX; i ++ )
dp[i] = -INF;
}
int dfs( int node ) {
viz[node] = 1;
if ( dp[node] == -INF ) {
dp[node] = v[node];
for ( auto& x : edges[node] ) {
if ( !viz[x] ) {
dp[node] += dfs( x );
}
}
}
return max( dp[node], 0 );
}
int main() {
ifstream fin( "asmax.in" );
ofstream fout( "asmax.out" );
int n, i;
fin >> n;
for ( i = 0; i < n; i ++ ) {
fin >> v[i + 1];
}
for ( i = 0; i < n - 1; i ++ ) {
int a, b;
fin >> a >> b;
edges[a].push_back( b );
edges[b].push_back( a );
}
init();
int maxim = dfs( 1 );
for ( i = 1; i <= n; i ++ ) {
///cout << dp[i] << ' ';
maxim = max( maxim, dp[i] );
}
fout << maxim;
return 0;
}