Cod sursa(job #2159581)

Utilizator dragosmdvMoldovan Dragos dragosmdv Data 11 martie 2018 01:18:11
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;

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

vector <int > v[16001];
stack<int >f;
int n, m, a, b,maxi, cost[16001];


void caut_frunze()
{
    for(int i=1;i<=n;i++)
        if(v[i].size()==1)
        f.push(i);
}


void afis_arb()
{
    for(int i=1;i<=n;i++)
    {
        cout<<i<<": ";
        for(int j=0;j<v[i].size();j++)
            cout<<v[i][j]<<" ";
        cout<<endl;
    }
}

int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>cost[i];
    for(int i=1;i<=n-1;i++)
    {
        fin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
//
//    afis_arb();
//    v[1].erase(find(v[1].begin(),v[1].end(),3));
//
//    afis_arb();
        caut_frunze();
        while(!f.empty())
        {
            int nod=f.top();
            f.pop();
            while(v[nod].size()==1 && cost[nod]<0)
            {
                int aux=v[nod][0];

                v[aux].erase(find(v[aux].begin(),v[aux].end(),nod));
                v[nod].pop_back();
                nod=aux;
            }
            while(v[nod].size()==1)
            {
                int aux=v[nod][0];
                if(cost[aux]+cost[nod]>cost[aux])
                    {cost[aux]=cost[aux]+cost[nod];
                    maxi=cost[aux];
                    }
                v[aux].erase(find(v[aux].begin(),v[aux].end(),nod));
                v[nod].pop_back();
                nod=aux;


            }



            }
fout<<maxi;
//        afis_arb();
//        for(int i=1;i<=n;i++)
//            cout<<cost[i]<<" ";



    return 0;
}
//7
//-1 1 3 1 -1 1 -1
//4 1
//1 3
//1 2
//6 5
//6 4
//7 5