Pagini recente » Cod sursa (job #2543735) | Cod sursa (job #867287) | Cod sursa (job #659281) | Cod sursa (job #1281670) | Cod sursa (job #570021)
Cod sursa(job #570021)
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> nr[16100];
int N,SOL;
int val[16100],s[16100];
char viz[16100];
void df(int x){
viz[x]=1;
for(vector<int>::iterator it=nr[x].begin();it!=nr[x].end();++it){
if(!viz[*it])
df(*it);
}
int su=0,mx=-10000;
for(vector<int>::iterator it=nr[x].begin();it!=nr[x].end();++it){
if(viz[*it]!=2)
continue;
if(s[*it]>0)
su+=s[*it];
if(s[*it]>mx)
mx=s[*it];
}
if(mx>su+val[x])
s[x]=mx;
else
s[x]=val[x]+su;
if(SOL<s[x])
SOL=s[x];
viz[x]=2;
}
int main(){
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
int x,y,i,neg=-100000;
scanf("%d",&N);
for(i=1;i<=N;++i){
scanf("%d",&val[i]);
if(val[i]>neg)
neg=val[i];
}
if(neg<=0){
printf("%d\n",neg);
return 0;
}
for(i=1;i<N;++i){
scanf("%d%d",&x,&y);
nr[x].push_back(y);
nr[y].push_back(x);
}
SOL=-1000000;
df(1);
printf("%d\n",SOL);
fclose(stdin);
fclose(stdout);
return 0;
}