Cod sursa(job #2391737)

Utilizator MicuMicuda Andrei Micu Data 29 martie 2019 10:18:15
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("asmax.in");
ofstream out("asmax.out");

const int N = 16001, MIN=-16000000;
int lst[N], vf[2*N], urm[2*N], v[N], smax[N], callstack[N], nr=0, top=-1;

void Add(int x, int y);
bool InStack(int p);
int SMax(int i);

int main()
{
    int n;
    in >> n;
    for(int i=1; i<=n; i++)
    {
        in >> v[i];
        smax[i]=MIN;
    }
    for(int i=1; i<=n-1; i++)
    {
        int x, y;
        in >> x >> y;
        Add(x, y);
        Add(y, x);
    }

    int smx=MIN;

    for(int i=1; i<=n; i++)
    {
        smx=max(smx, SMax(i));
    }
    out << smx;
    return 0;
}

void Add(int x, int y)
{
    nr++;
    vf[nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}

bool InStack(int p)
{
    for(int i=0; i<=top; i++)
    {
        if(callstack[i]==p) return true;
    }
    return false;
}

int SMax(int i)
{
    callstack[++top]=i;
    if(smax[i]!=MIN)
    {
        top--;
        return smax[i];//rezultatul a fost deja calculat
    }

    smax[i]=v[i];
    for(int p=lst[i];p;p=urm[p])
    {
        if(!InStack(vf[p]))
        {
            if(SMax(vf[p])>0) smax[i]+=SMax(vf[p]);
        }
    }

    top--;
    return smax[i];
}