Cod sursa(job #356732)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 16 octombrie 2009 09:02:49
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<climits>
#define N 16001
int x[N],y[N],d[N],*a[N],n;
int rez=-10000,v[N];
bool viz[N];
void citire()
{
	freopen("asmax.in","r",stdin);
	freopen("asmax.out","w",stdout);
	scanf("%d",&n);
	for (int i=1; i<=n; ++i)
		scanf("%d",&v[i]);
	for (int i=1; i<n; ++i)
	{
		scanf("%d%d",&x[i],&y[i]);
		++d[x[i]];
		++d[y[i]];
	}
	for (int i=1;i<=n; ++i)
	{
		a[i]=new int [1+d[i]];
		a[i][0]=0;
	}
	for (int i=1; i<n; ++i)
	{
		a[x[i]][++a[x[i]][0]]=y[i];
		a[y[i]][++a[y[i]][0]]=x[i];
	}
}
void dfs(int x0)
{
	viz[x0]=true;
	int max=-10000;
	for (int i=1; i<=a[x0][0]; ++i)
	{
		if (viz[a[x0][i]])
			continue;
		dfs(a[x0][i]);
		if (v[a[x0][i]]>0)
		{
			v[x0]+=v[a[x0][i]];
			if (rez<v[a[x0][i]])
				rez=v[a[x0][i]];
		}
		else
		{
			if(max<v[a[x0][i]])
				max=v[a[x0][i]];
			if (rez<max)
				rez=max;
		}
	}
}
/*void afis()
{
	for (int i=1; i<=n; ++i)
	{
		printf("%d: ",i);
		for(int j=1; j<=a[i][0]; ++j)
			printf("%d ",a[i][j]);
		printf("\n");
	}
}*/
int main()
{
	citire();
	//afis();
	dfs(1);
	if (v[1]>0)
		{
			if (rez<v[1])
				rez=v[1];
		}
		else
		{
			int max=-1000;
			if(max<v[1])
				max=v[1];
			if (rez<max)
				rez=max;
		}
	printf("%d",rez);
	return 0;
}