Pagini recente » Cod sursa (job #902561) | Cod sursa (job #1635531) | Cod sursa (job #2051796) | Cod sursa (job #390149) | Cod sursa (job #1556619)
#include<cstdio>
#include<vector>
using namespace std;
vector<int> g[16001],niv[16001];
int v[16001],vc[16001],nivmax=1,sol[16001];
void dfs(int nod,int nivel){
int i,a=g[nod].size();
for(i=0;i<a;i++)
if(vc[g[nod][i]]==0){
vc[g[nod][i]]=1;
niv[nivel+1].push_back(g[nod][i]);
if(nivel+1>nivmax)
nivmax=nivel+1;
dfs(g[nod][i],nivel+1);
}
}
int main (){
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
int n,i,a,b,j,k,maxi=-1000000000;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n-1;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
niv[1].push_back(1);
vc[1]=1;
dfs(1,1);
a=niv[nivmax].size();
for(i=0;i<a;i++){
sol[niv[nivmax][i]]=v[niv[nivmax][i]];
if(sol[niv[nivmax][i]]>maxi)
maxi=sol[niv[nivmax][i]];
}
for(i=nivmax-1;i>=1;i--){
a=niv[i].size();
for(j=0;j<a;j++){
sol[niv[i][j]]=v[niv[i][j]];
b=g[niv[i][j]].size();
for(k=0;k<b;k++)
if(sol[g[niv[i][j]][k]]>0)
sol[niv[i][j]]+=sol[g[niv[i][j]][k]];
if(sol[niv[i][j]]>maxi)
maxi=sol[niv[i][j]];
}
}
printf("%d",maxi);
return 0;
}