Cod sursa(job #3361931)

Utilizator RaduBalasRadu Andrei Balas RaduBalas Data 30 iulie 2026 10:26:42
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb

#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;
}