Pagini recente » Cod sursa (job #1292550) | Cod sursa (job #1704042) | Cod sursa (job #182989) | Cod sursa (job #1472531) | Cod sursa (job #1554746)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define nmax 16010
using namespace std;
int n,i,j,sol,x,y;
int dp[nmax],t[nmax];
vector <int> g[nmax];
bool fr[nmax];
//dp[nod] suma valorilor din suboarbele lui nod;
int memo(int nod,int tata)
{
if (fr[nod]) return dp[nod];
fr[nod]=true; int value=0;
for (unsigned int i=0;i<g[nod].size();i++)
if (g[nod][i]!=tata && !fr[g[nod][i]]) value+=memo(g[nod][i],nod);
if (value+t[nod]>0) dp[nod]=value+t[nod]; else dp[nod]=0;
if (dp[nod]>0) sol=max(sol,dp[nod]);
return dp[nod];
}
int main() {
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n); sol=-999999999;
for (int i=1;i<=n;i++) scanf("%d",&t[i]),sol=max(sol,t[i]);
for (int i=1;i<=n-1;i++) {
scanf("%d %d",&x,&y);
g[x].push_back(y); g[y].push_back(x);
}
memo(1,0);
printf("%d\n",sol);
return 0;
}