Cod sursa(job #846655)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 2 ianuarie 2013 16:24:23
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
const char iname[] = "asmax.in";
const char oname[] = "asmax.out";
ifstream fin(iname);
ofstream fout(oname);
int N , M , i , j , x , y , comp_conexe , gasit , solc;
int vec[16004], dad[16004];
int cost_nod[ 16004 ];
bool viz[ 16004 ];
vector < int > Q[ 16004 ];
stack < int > st;
int main()
{
    fin >> N;
    for (i = 1; i <= N; ++i)
        fin >> cost_nod[i];
    for (i = 1; i <= N-1; ++i)
        fin >> x >> y , Q[x].push_back(y) , Q[y].push_back(x);
    vector < int > :: iterator it;
    viz[1] = 1;
    st.push(1);
	for (int i = 1; i <= N; ++i) vec[i] = cost_nod[i];
    while(!st.empty())
    {
        x = st.top();
        gasit = 0;
        while(!Q[x].empty())
        {
            if (!viz[Q[x].front()])
            {
                it = Q[x].begin();
				dad[*it] = x;
                st.push(*it);
                viz[*it] = 1;
                Q[x].erase(Q[x].begin());
                gasit = 1;
                break;
            }
            else
				Q[x].erase(Q[x].begin());
        }
        if (!gasit)
		{
            st.pop();
			if (vec[x] > 0)
				vec[dad[x]] += vec[x];
		}
    }
	for (int i = 1; i <= N; ++i) if (solc < vec[i]) solc = vec[i];
    fout << solc << '\n';
    return 0;
}