Cod sursa(job #479277)

Utilizator c_adelinaCristescu Adelina c_adelina Data 23 august 2010 15:21:16
Problema Asmax Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <vector>
#include <deque>
using namespace std;

vector <int> nod[16006];
deque <int> t;
int vecini[16006],ok[16006],v[16006];
 
int main ()
{
	int n,i,x,y,sol=-1000,nr=0;
	freopen("asmax.in","r",stdin);
	freopen("asmax.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;++i)
		scanf("%d",&v[i]);
	for (i=1;i<n;++i)
	{
		scanf("%d %d",&x,&y);
		nod[x].push_back(y);nod[y].push_back(x);
		++vecini[x],++vecini[y];
	}
	for (i=1;i<=n;++i)
		if (vecini[i]==1)
		{
			if (v[i]>0)
				v[nod[i].front()]+=v[i];
			ok[i]=1,t.push_back(nod[i].front()),++nr;
		}
	while (!t.empty())
		for (i=nr,nr=0;i>0;--i)
		{
			x=t.front();t.pop_front();
			if (v[x]>0)
			while (!nod[x].empty())
			{
				if (!ok[nod[x].back()])
					{v[nod[x].back()]+=v[x];++nr;t.push_back(nod[x].back());}
				nod[x].pop_back();
			} else
				while (!nod[x].empty()) 
				{
					if (!ok[nod[x].back()]) ++nr,t.push_back(nod[x].back());
     				nod[x].pop_back();}
		ok[x]=1;
		}	
		for (i=1;i<=n;++i)
		if (v[i]>sol) sol=v[i];
	printf("%d",sol);
		return 0;}