Cod sursa(job #1194499)

Utilizator gapdanPopescu George gapdan Data 3 iunie 2014 23:13:46
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define max(a,b) (a>b?a:b)
#define NMAX 16005
#include<cmath>
using namespace std;
int best[NMAX],viz[NMAX],a[NMAX];
vector<int>v[NMAX];
vector<int>vec;
void DFS(int nod)
{
    viz[nod]=1;
    vector<int>::iterator it;
    for(it=v[nod].begin();it!=v[nod].end();++it)
    {
        if (viz[*it]==0) DFS(*it);
    }
    vec.push_back(nod);
}
int main()
{
    int n,i,x,y;
    freopen("asmax.in","r",stdin);
    freopen("asmax.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;++i) scanf("%d",&a[i]);
    for(i=1;i<n;++i)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }

    vector<int>::iterator it;
    int sum=(-1)*INFINITY;
    DFS(1);
    for (i=1;i<=n;++i) viz[i]=0;
    for (it=vec.begin();it!=vec.end();++it)
    {
       best[*it]=a[*it];
       sum=max(sum,best[*it]);
       vector<int>::iterator t;
       for (t=v[*it].begin();t!=v[*it].end();++t)
       {
           if (viz[*t])
           {
               best[*it]=max(best[*it],best[*it]+best[*t]);
               sum=max(sum,best[*it]);
           }
       }
       viz[*it]=true;
    }
    printf("%d\n",sum);
    return 0;
}