Pagini recente » Monitorul de evaluare | Cod sursa (job #736156) | Cod sursa (job #356510) | Cod sursa (job #1047499) | Cod sursa (job #1495241)
#include<cstdio>
#include<vector>
using namespace std;
int n,val[16001];
long long maxim,arb[16001];
vector<int>v[16001];
long long dfs(int nod,int tata){
int subarb,sum;
sum=0;
if(v[nod].size()==1)
return max(0,val[nod]);
for(int i=0;i<v[nod].size();i++)
if(v[nod][i]!=tata){
if(arb[v[nod][i]]==-16000001)
subarb=dfs(v[nod][i],nod);
else
subarb=arb[v[nod][i]];
if(subarb>maxim)
maxim=subarb;
if(subarb>0)
sum+=subarb;
}
if(val[nod]>=0&&sum>=0)
arb[nod]=sum+val[nod];
else
if(val[nod]<0&&sum+val[nod]>=0)
arb[nod]=sum+val[nod];
else
arb[nod]=0;
if(arb[nod]>maxim)
maxim=arb[nod];
return arb[nod];
}
int main(){
int a,b;
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
arb[i]=-16000001;
}
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
maxim=-16000001;
long long rez=dfs(1,0);
printf("%lld",maxim);
return 0;
}