Cod sursa(job #537166)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 20 februarie 2011 12:25:31
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <vector>
#define pb push_back
#define TR(C, i)\
    for(typeof(C.begin()) i = C.begin(); i < C.end(); i++)

using namespace std;

const int nmax = 1 << 14;
vector <int> fii[nmax];
vector <int> lev[nmax];

int T[nmax], levmax, bestmax = -1024, best[nmax], val[nmax];

void DFS(int x, int unde)
{
    lev[unde].pb(x);
    T[x] = 1;
    TR(fii[x], i)
        if(T[*i] == 0)
            DFS(*i, unde + 1);
    if(unde > levmax)
        levmax = unde;
}

void up()
{
    vector <int>::iterator it;
    vector <int>::iterator jos;
    int i;
    for(i = levmax; i >= 0; i--)
        for(it = lev[i].begin(); it < lev[i].end(); it++)
        {
            best[*it] = val[*it];
            for(jos = fii[*it].begin(); jos < fii[*it].end(); jos++)
                if(best[*jos] > 0)
                    best[*it] += best[*jos];
            if(best[*it] > bestmax)
                bestmax = best[*it];
        }
    printf("%d\n",bestmax);
}



int main()
{
    freopen ("asmax.in","r",stdin);
    freopen ("asmax.out","w",stdout);

    int N, i, a, b;
    scanf("%d",&N);
    for(i = 1; i <= N; i++)
        scanf("%d",&val[i]);
    for(i = 1; i < N; i++)
    {
        scanf("%d %d",&a,&b);
        fii[a].pb(b);
        fii[b].pb(a);
    }
    DFS(1, 0);
    up();
    return 0;
}