Pagini recente » Cod sursa (job #690697) | Cod sursa (job #2610896) | Cod sursa (job #1776205) | Cod sursa (job #1763078) | Cod sursa (job #2669757)
#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] ) {
int val = dfs( x );
val = max( val, 0 );
dp[node] += val;
}
}
}
return dp[node];
}
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 = -INF;
dfs( 1 );
for ( i = 1; i <= n; i ++ ) {
///cout << dp[i] << ' ';
maxim = max( maxim, dp[i] );
}
fout << maxim;
return 0;
}