Cod sursa(job #478880)

Utilizator c_adelinaCristescu Adelina c_adelina Data 20 august 2010 22:28:17
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>
#include <vector>
#include <deque>
#include <cstring>
using namespace std;

deque <int> up;
vector <int> ok[16008];
int f[16000],t[16000];
int v[16008],mx[16008],vecini[16008];

int main()
{
	int a,b,i,n;
	mx[0]=-1000;
	freopen("asmax.in","r",stdin);
	freopen("asmax.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;mx[i]=-1000,++i)
		scanf("%d",&v[i]);
	for (i=1;i<n;++i)
	    {scanf("%d %d",&a,&b);ok[a].push_back(b);ok[b].push_back(a);++vecini[a];++vecini[b];}
	for (b=0,i=1;i<=n;++i)
		if (vecini[i]<2)
			{mx[i]=v[i],f[i]=1;
		     if (!t[ok[i].front()]) ++b,up.push_back(ok[i].front()),t[ok[i].front()]=1;
			}
	while (b>0)
	{
		int f2[16008]={},t2[16008]={};
		for (i=b,b=0;i>0;--i)
		{
			int x=up.front(),sum=v[x];up.pop_front();
			int q[16008],pl=0,j;
				for (;!ok[x].empty();) 
					{++pl,q[pl]=ok[x].back();ok[x].pop_back();}
				for (j=1;j<=pl;++j)
					{ok[x].push_back(q[j]);
						if (f[q[j]]) 
						{if (sum+v[q[j]]>sum) sum+=v[q[j]];} else 
							if (!t2[q[j]]) up.push_back(q[j]),++b,t2[q[j]]=1;
					}
				f2[x]=1;
				if (sum>mx[x]) mx[x]=sum;
		}
		for (i=1;i<=n;++i) f[i]=f2[i];
	}
	for (i=1;i<=n;++i) if (mx[i]>mx[0]) mx[0]=mx[i];
	printf("%d",mx[0]);
	return 0;}