Cod sursa(job #1154856)

Utilizator heracleRadu Muntean heracle Data 26 martie 2014 14:00:21
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <vector>

FILE* in;
FILE* out;

const int Q=16002,INF=1999999999;

std::vector<int> f[Q];

int v[Q+1],tat[Q+1];

int max(int a, int b)
{
    return a>b?a:b;
}

void dfs(int act, int tata, int& valmaxsubarb, int& valmaxradacin)
{
    if(f[act].size()==1)
    {
        valmaxsubarb=v[act];
        valmaxradacin=v[act];
        return;
    }

    int kv,xv;
    valmaxsubarb=-INF;
    valmaxradacin=-INF;


    for(int i=0; i<f[act].size(); i++)
    {
        if(f[act][i]==tata)
            continue;
        dfs(f[act][i],act,kv,xv);

        if(kv>valmaxsubarb)
            valmaxsubarb=kv;
        if(xv>0)
        {
            valmaxradacin=max(valmaxradacin+xv,xv);
        }
    }
    valmaxradacin=max(v[act],valmaxradacin+v[act]);
    if(valmaxradacin>valmaxsubarb)
        valmaxsubarb=valmaxradacin;

}

int main()
{
    in=fopen("asmax.in","r");
    out=fopen("asmax.out","w");

    int n;
    fscanf(in,"%d",&n);

    for(int i=1; i<=n; i++)
        fscanf(in,"%d",&v[i]);

    int a,b;

    for(int i=1; i<n; i++)
    {
        fscanf(in,"%d%d",&a,&b);
        f[a].push_back(b);
        f[b].push_back(a);
    }

    int act=-INF,ma=-INF,k,x;

    for(int i=0; i<f[1].size(); i++)
    {
        dfs(f[1][i],1,k,x);
        if(k>ma)
            ma=k;
        if(x>0)
        {
            act=max(act+x,x);
        }
    }
    act=max(v[1],act+v[1]);
    fprintf(out,"%d",max(act,ma));

    return 0;
}