Cod sursa(job #123619)

Utilizator savimSerban Andrei Stan savim Data 16 ianuarie 2008 20:04:42
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>

#define maxm 100001

int n,m,i,t,min;
int x[maxm],y[maxm],v[maxm],val[maxm];
int a[2*maxm];
int g[2*maxm];

void inter(int p, int q)
{
	int r=(p+q)/2,t1,t2,k=0;
	t1=p;
	t2=r+1;
	while (t1<=r && t2<=q)
	{
		  k++;
		  if (val[t1]<val[t2])
		  {
			 x[k]=val[t1];
			 t1++;
		  }
		  else
		  {
			  x[k]=val[t2];
			  t2++;
		  }
	}
	while (t1<=r)
	{
		k++;
		x[k]=val[t1];
		t1++;
	}
	while (t2<=q)
	{
		k++;
		x[k]=val[t2];
		t2++;
	}
	int i;k=0;
	for (i=p; i<=q; i++)
	{
		k++;
		val[i]=x[k];
	}
}
void merge(int p, int q)
{
	int r=(p+q)/2;
	if (p==q || q<p) return;
	merge(p,r);
	merge(r+1,q);
	inter(p,q);
	if (q<=p+1) return;
}

int df(int k)
{
	int i,p,q;
	for (i=g[k]; i<=g[k+1]-1; i++)
		if (y[a[i]]==0)
		{
			y[a[i]]=1;
			v[i]=df(a[i]);
			y[a[i]]=0;
		}

	p=0;q=0;
	int s=0;
	for (i=g[k]; i<=g[k+1]-1; i++)
	if (y[a[i]]==0)
	{
		s++;
		val[s]=v[i];
	}

	merge(1,s);

	s=0;
	for (i=g[k]; i<=g[k+1]-1; i++)
	if (y[a[i]]==0)
	{
		s++;
		v[i]=val[s];
	}

	for (i=g[k+1]-1; i>=g[k]; i--)
	if (y[a[i]]==0)
	{
		p++;
		if (v[i]+p>q) q=v[i]+p;
	}
	return q;
}
int main()
{
	freopen("zvon.in","r",stdin);
	freopen("zvon.out","w",stdout);

	scanf("%d",&n);
	for (t=1; t<=n; t++)
	{
		scanf("%d",&m);
		for (i=1; i<=m+1; i++)
		{
			g[i]=0;
			a[i]=0;
		}
		for (i=1;i<=m-1;i++)
		{
			scanf("%d %d ",&x[i],&y[i]);
			g[x[i]]++;
			g[y[i]]++;
		}

		for (i=2;i<=m+1;i++) g[i] += g[i-1];

		for (i=1;i<=m-1;i++)
		{
			a[g[x[i]]]= y[i];
			g[x[i]]--;
			a[g[y[i]]] = x[i];
			g[y[i]]--;
		}

		for (i=1;i<=m+1;i++) g[i]++;

		for (i=1; i<=m; i++)
		{
			y[i]=0;
			v[i]=0;
		}
		y[1]=1;
		if (m!=1) printf("%d\n",df(1));
		else printf("0\n");
	}


	return 0;
}