Pagini recente » Cod sursa (job #3359493) | Cod sursa (job #3361931)
#include <stdio.h>
#define MAXN 16010
#define MAXE 32020
int val[MAXN],cap[MAXN],to[MAXE],urm[MAXE],par[MAXN],st[MAXN],ord[MAXN],dp[MAXN];
int main(){
FILE *fin, *fout;
fin=fopen("asmax.in","r");
fout=fopen("asmax.out","w");
int n,i,j,a,b,e,top,cnt,cur,nb,ans;
fscanf(fin,"%d",&n);
for(i=1; i<=n; i++)
fscanf(fin,"%d",&val[i]);
for(i=1; i<=n; i++)
cap[i]=-1;
e=0;
for(i=0; i<n-1; i++){
fscanf(fin,"%d %d",&a,&b);
to[e]=b;
urm[e]=cap[a];
cap[a]=e++;
to[e]=a;
urm[e]=cap[b];
cap[b]=e++;
}
top=cnt=0;
par[1]=0;
st[top++]=1;
while(top>0){
cur=st[--top];
ord[cnt++]=cur;
for(i=cap[cur];i!=-1;i=urm[i]){
nb=to[i];
if(nb==par[cur])
continue;
par[nb]=cur;
st[top++]=nb;
}
}
ans=-1000000000;
for(i=cnt-1;i>=0;i--){
cur=ord[i];
dp[cur]=val[cur];
for(j=cap[cur]; j!=-1; j=urm[j]){
nb=to[j];
if(nb==par[cur])
continue;
if(dp[nb]>0)
dp[cur]+=dp[nb];
}
if(dp[cur]>ans)
ans=dp[cur];
}
fprintf(fout,"%d\n",ans);
return 0;
}