Cod sursa(job #1246766)

Utilizator andreiulianAndrei andreiulian Data 21 octombrie 2014 17:16:41
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
long n,val[16005],d[16005],maxi,k,R,s[20000],u;
bool viz[16005];
vector<long> v[16005];
ifstream in("asmax.in");
ofstream out("asmax.out");
long dinamica(long i);
int main()
{
    in>>n;
    long i,a,b,p;
    for(i=1;i<=n;i++)
    {
        in>>val[i];
        v[i].push_back(0);
    }
    for(i=1;i<n;i++)
    {
        in>>a>>b;
        v[b].push_back(a);
        v[a].push_back(b);
        v[a][0]++;
        v[b][0]++;
    }
    for(i=1;i<=n;i++) if(v[i][0]>maxi) maxi=v[i][0],k=i;
    dinamica(k);
    if(R==0) {out<<-2<<'\n'; return 0;}
    out<<R<<'\n';
}
long dinamica(long i)
{
    s[++u]=i;
    long j,vv,su;
    bool f;
    while(u)
    {
        su=s[u];
        viz[su]=1;
        f=1;
        for(j=1;j<=v[su][0];j++)
        {
            vv=v[su][j];
            if(!viz[vv])
                s[++u]=vv,f=0,viz[vv]=1;
        }
        if(f==1)
        {
            d[su]=val[su];
            for(j=1;j<=v[su][0];j++)
            {
                vv=v[su][j];
                d[su]+=d[vv];
            }

            if(d[su]<0) d[su]=0;
            else
            {
                if(d[su]>R) R=d[su];
            }
            u--;
        }
    }
}