Cod sursa(job #587999)

Utilizator MKLOLDragos Ristache MKLOL Data 6 mai 2011 17:30:18
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#include<vector>

using namespace std;

#define Nmax 20000

vector<int> g[Nmax],g2[Nmax];
int best[Nmax],N,x,y,was[Nmax],t[Nmax],cost[Nmax],maxim=-123578;
char verif[Nmax];
int df(int x)
{
    int S=0;
    if(verif[x])
        return best[x];
    verif[x]=1;

    vector<int> :: iterator it;

    for(it=g[x].begin();it!=g[x].end();++it)
    {

            if(df(*it)>=0)
                S+=df(*it);
    }
    /*for(it=g[x].begin();it!=g[x].end();++it)
    {
        if(best[*it]>=0)
        S+=best[*it];
    }*/
    best[x]=S+cost[x];
    return S+cost[x];
}
int df2(int x,int dad)
{

    was[x]=1;
    t[x]=dad;
     vector<int> :: iterator it;

    for(it=g2[x].begin();it!=g2[x].end();++it)
    {
     //          if(*it==13)
       //     printf("!#@#@$");
            if(was[*it]==0)
                df2(*it,x);
    }
}
int main()
{
    freopen("asmax.in","r",stdin);
    freopen("asmax.out","w",stdout);

    scanf("%d",&N);
    for(int i=1;i<=N;++i)
        scanf("%d",&cost[i]);

    for(int i=1;i<N;++i)
    {
        scanf("%d%d",&x,&y);

        g2[x].push_back(y);
        g2[y].push_back(x);
    }
    df2(1,0);
    for(int i=1;i<=N;++i)
    {
        g[t[i]].push_back(i);
     //   printf("%d %d!\n",t[i],i);
    }

    for(int i=1;i<=N;++i)
        {
        maxim=max(df(i),maxim);
   //     printf("%d %d\n",df(i),i);
        }
    printf("%d\n",maxim);
}