Pagini recente » Cod sursa (job #2853754) | Cod sursa (job #669156) | Cod sursa (job #2582065) | Cod sursa (job #1368106) | Cod sursa (job #587999)
Cod sursa(job #587999)
#include<stdio.h>
#include<vector>
using namespace std;
#define Nmax 20000
vector<int> g[Nmax],g2[Nmax];
int best[Nmax],N,x,y,was[Nmax],t[Nmax],cost[Nmax],maxim=-123578;
char verif[Nmax];
int df(int x)
{
int S=0;
if(verif[x])
return best[x];
verif[x]=1;
vector<int> :: iterator it;
for(it=g[x].begin();it!=g[x].end();++it)
{
if(df(*it)>=0)
S+=df(*it);
}
/*for(it=g[x].begin();it!=g[x].end();++it)
{
if(best[*it]>=0)
S+=best[*it];
}*/
best[x]=S+cost[x];
return S+cost[x];
}
int df2(int x,int dad)
{
was[x]=1;
t[x]=dad;
vector<int> :: iterator it;
for(it=g2[x].begin();it!=g2[x].end();++it)
{
// if(*it==13)
// printf("!#@#@$");
if(was[*it]==0)
df2(*it,x);
}
}
int main()
{
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;++i)
scanf("%d",&cost[i]);
for(int i=1;i<N;++i)
{
scanf("%d%d",&x,&y);
g2[x].push_back(y);
g2[y].push_back(x);
}
df2(1,0);
for(int i=1;i<=N;++i)
{
g[t[i]].push_back(i);
// printf("%d %d!\n",t[i],i);
}
for(int i=1;i<=N;++i)
{
maxim=max(df(i),maxim);
// printf("%d %d\n",df(i),i);
}
printf("%d\n",maxim);
}