Cod sursa(job #1495244)

Utilizator avaspAva Spataru avasp Data 2 octombrie 2015 19:41:45
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#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;
}