Cod sursa(job #1038844)

Utilizator marinutzacatana marina marinutza Data 22 noiembrie 2013 00:04:57
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<fstream>
using namespace std;
ifstream f("asmax.in");
ofstream g("asmax.out");
struct nod
{
    int nr;
    nod *adr;
};
nod *a[16010];
int n,c[16010],ord[16010],cmax,ok[16010],j;
void citire()
{
    f>>n;
    for(int i=1;i<=n;i++)
        f>>c[i];
    for(int i=1;i<n;i++)
    {
        int x,y;
        f>>x>>y;
        nod *p=new nod;
        p->nr=y;
        p->adr=a[x];
        a[x]=p;
        p=new nod;
        p->nr=x;
        p->adr=a[y];
        a[y]=p;
    }
}
void parcurgere(int x,int i)
{
    if(i<=n)
    {
        ok[x]=1;
        for(nod *p=a[x];p!=NULL;p=p->adr)
        {
            if(ok[p->nr]==0)
            {
                ord[++j]=p->nr;
                ok[p->nr]=1;
            }
        }
        parcurgere(ord[i+1],i+1);
    }
}
void rezolvare(int x)
{
    int maxim=-1010;
    int s=0;
    int r=ord[x];
    if(x>0)
    {
        for(nod *p=a[r];p!=NULL;p=p->adr)
        {
            if(ok[p->nr]==0)
            {
                if(c[p->nr]>0)
                    s+=c[p->nr];
                if(c[p->nr]>maxim)
                    maxim=c[p->nr];
            }
        }
        if(s>0)
            maxim=s;
        if(c[r]+maxim>c[r])
            c[r]+=maxim;
    }
}
int main()
{
    citire();
    ord[1]=1;
    j=1;
    parcurgere(1,1);
    cmax=-1010;
    for(int i=n;i>0;i--)
    {
        rezolvare(i);
        ok[ord[i]]=0;
        if(c[ord[i]]>cmax)
            cmax=c[ord[i]];
    }
    g<<cmax;
    return 0;
}