Cod sursa(job #157963)

Utilizator viktor0710Ardelean Cristian-Viktor viktor0710 Data 13 martie 2008 13:16:11
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
# include <stdio.h>
# include <values.h>

typedef struct nod {
		long key;
		nod *next;
	     };
nod *a[100010];
long n, grad[100010],t[100010];

void calc (long n)
{
	if ( a[n] == NULL )
		t[n] = 0;
	else
	 {
		for ( nod *q = a[n]; q; q=q->next )
			calc ( q->key );
		int nr = -1;
		for ( nod *w = a[n]; w; w=w->next )
			grad[++nr] = t[w->key];

	      if (nr > 0)
	      {
		long mij ,i,j,aux,st=0,dr=nr;
		int ok=1;
		while (ok)
			{
				i = st; j = dr;
				ok = 0; mij = (dr + st )/2;
				do
				 {
				   while ( grad[i] < grad[mij] ) ++i;
				   while ( grad[j] > grad[mij] ) --j;
				   if ( i <= j )
					{
						aux = grad[i];
						grad[i] = grad[j];
						grad[j] = aux;
						++i;--j;
					}
				 }
				while ( i < j );
				if ( st < j )
					{
						dr = j;
						ok = 1;
					}
				if ( dr > i )
					{
						st = i;
						ok = 1;
					}
			}
	      }
		t[n] = 0;
		long maxim = 0;
		for (int i = 0; i <= nr; ++ i )
		if ( maxim < grad[i]+nr-i+1 )
			maxim = grad[i]+nr-i+1;
		t[n] = maxim;
	 }
}

void add ( long x, long y )
{
nod *p;
	p = new nod;
	p->key = y;
	p->next = a[x];
	a[x] = p;
}

void cit ()
{
 int m;
	freopen ( "zvon.in", "r", stdin ); freopen ( "zvon.out", "w", stdout );
	scanf ( "%d", &m );
	for ( int i = 0; i < m; ++ i )
		{
			scanf ( "%ld", &n );
			if ( n <= 1 )
				printf ( "0\n" );
			else
			 {      long x,y;
			  for ( long j = 0; j < n-1; ++ j )
			   {
				scanf ( "%ld %ld", &x, &y );
				add ( x, y );
			   }
			  calc(1);
			  printf ( "%ld\n", t[1] );
			 }
		for ( long k = 0; k <= n; ++ k )
		    a[k] = NULL;
		}
	fclose ( stdout ); fclose ( stdin );
}

int main ()
{
	cit ();
	return 0;
}