Cod sursa(job #478878)

Utilizator c_adelinaCristescu Adelina c_adelina Data 20 august 2010 21:55:22
Problema Asmax Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 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 main()
{
	int v[16008],max[16008],a,b,i,n;
	max[0]=-1000;
	freopen("asmax.in","r",stdin);
	freopen("asmax.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;max[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);}
	for (b=0,i=1;i<=n;++i)
		if (ok[i].end()-ok[i].begin()<2)
			{max[i]=v[i],f[i]=1;
		     if (!t[ok[i].front()]) ++b,up.push_back(ok[i].front());
			}
	while (b>0)
	{
		int f2[]={},t2[]={};
		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]]) 
						sum+=v[q[j]]; else 
							if (!t2[ok[i].front()]) up.push_back(q[j]),++b;
					}
				f2[x]=1;
				if (sum>max[i]) max[i]=sum;
		}
		for (i=1;i<=n;++i) f[i]=f2[i];
	}
	for (i=1;i<=n;++i) if (max[i]>max[0]) max[0]=max[i];
	printf("%d",max[0]);
	return 0;}