Cod sursa(job #2244557)

Utilizator UnseenMarksmanDavid Catalin UnseenMarksman Data 23 septembrie 2018 01:02:10
Problema Asmax Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define maxn 16002
using namespace std;

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

int n, v[maxn], c[maxn], vc[maxn], nrc, res;
vector<int>A[maxn];
vector<int>B;

void dfs(int nod)
{
    vc[nrc]=vc[nrc]+v[nod];
    c[nod]=nrc;
    for(auto it:A[nod])
    {
        if(0<=v[it]&&!c[it])
        {
            dfs(it);
        }
    }
}

void dfs2(int nod, int comp)
{
    c[nod]=comp;
    for(auto it:A[nod])
    {
        if(c[it]!=comp)
        {
            dfs2(it,comp);
        }
    }
}

bool val(const int &a, const int &b)
{
    return v[a]>v[b];
}

int main()
{
    int x,y;
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
    }
    for(int i=1; i<n; i++)
    {
        fin>>x>>y;
        A[x].push_back(y);
        A[y].push_back(x);
    }
    for(int i=1; i<=n; i++)
    {
        if(0<=v[i]&&!c[i])
        {
            nrc++;
            dfs(i);
            res=max(res,vc[nrc]);
        }
        else if(v[i]<0)
        {
            B.push_back(i);
        }
    }
    if(nrc==0)
    {
        sort(B.begin(),B.end(),val);
        fout<<v[B[0]]<<'\n';
        return 0;
    }
    for(auto it:B)
    {
        bool ok=false, ok1=false;
        int w;
        for(auto it2:A[it])
        {
            if(vc[c[it2]]+v[it]>=0)
            {
                if(!ok)
                {
                    ok=true;
                }
                else
                {
                    ok1=true;
                    w=c[it2];
                    break;
                }
            }
        }
        if(ok1)
        {
            vc[w]=vc[w]+v[it];
            c[it]=w;
            for(auto it2:A[it])
            {
                if(c[it2]!=w)
                {
                    vc[w]=vc[w]+vc[c[it2]];
                    dfs2(it2,w);
                }
            }
            res=max(res,vc[w]);
        }
    }
    fout<<res<<'\n';
    return 0;
}