Cod sursa(job #157230)

Utilizator viktor0710Ardelean Cristian-Viktor viktor0710 Data 12 martie 2008 21:56:17
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
# include <stdio.h>
# include <values.h>

typedef struct nod {
		int key;
		nod *next;
	     };
nod *a[100010];
int n;

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




	int 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;
	    }
	}
	int maxim = 0;
	for ( i = 0; i <= nr; ++ i )
		if ( maxim < grad[i]+nr-i+1 )
			maxim = grad[i]+nr - i+1;
	return maxim;
	 }
}

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

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

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