Pagini recente » Cod sursa (job #2585856) | Istoria paginii utilizator/andrei.butnaru | Cod sursa (job #1566845) | Cod sursa (job #2284240) | Cod sursa (job #1495244)
#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&&tata!=0)
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);
maxim=-16000001;
int maxv=maxim;
bool pp=true;
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
arb[i]=-16000001;
if(val[i]>0)
pp=false;
if(val[i]>maxv)
maxv=val[i];
}
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
long long rez=dfs(1,0);
if(maxim!=0||pp==false)
printf("%lld",maxim);
else
printf("%d",maxv);
return 0;
}