Pagini recente » Cod sursa (job #2226944) | Cod sursa (job #1760064) | Istoria paginii utilizator/cirstianalexandra1234 | Diferente pentru teorema-chineza-a-resturilor intre reviziile 34 si 33 | Cod sursa (job #1750216)
#include <cstdio>
#include <vector>
#include <cstring>
#define in "asmax.in"
#define out "asmax.out"
#define NMAX 16000 + 7
#define pb push_back
int n, v[NMAX], tata[NMAX], dp[NMAX], X, Y, mxn;
using namespace std;
vector <int> adj[NMAX];
inline void addEdge(const int &A, const int &B)
{
adj[A].pb(B);
adj[B].pb(A);
}
inline void citire()
{
//memset(dp, 3, sizeof(int));
scanf("%d", &n);
for(int i = 1; i<= n; ++i) scanf("%d", &v[i]);
for(int i = 1; i<= n-1; ++i)
{
scanf("%d %d", &X, &Y);
addEdge(X, Y);
}
tata[1] = -1;
}
int sum(const int &node)
{
if(dp[node] == 0) /// posibil fail
{
//printf("check node %d\n", node);
int sze = adj[node].size();
dp[node] = v[node];
for(int i = 0; i< sze; ++i)
{
int tmp = adj[node][i];
if(tata[node] == tmp) continue;
tata[tmp] = node;
int aux = sum(tmp);
if(aux > 0) dp[node] += sum(tmp);
}
}
return dp[node];
}
inline void solve()
{
mxn = dp[1];
for(int i = 2; i<= n; ++i) mxn = max(mxn, dp[i]);
}
int main()
{
freopen(in, "r", stdin);
freopen(out, "w", stdout);
citire();
//printf("%d\n", dp[1]);
dp[1] = sum(1);
//printf("%d\n", dp[1]);
solve();
printf("%d\n", mxn);
return 0;
}