Cod sursa(job #102835)

Utilizator coderninuHasna Robert coderninu Data 14 noiembrie 2007 18:54:23
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.95 kb
#include <stdio.h>
#include <stdlib.h>
#define Nmax 100001


struct nod { long inf; struct nod * urm;};
typedef nod * list;

int t;
long rad, n, i, Rez;
short radPos[Nmax];
list gr[Nmax];
long * d[Nmax];
long nrd=0;
long nrFii[Nmax];

void readNext();
void stergeVect();
long rez(long);
inline long max(long x, long y) { return x>y?x:y; }
long divide(long,long);
void qSort(long,long);


int main()
{
	freopen("zvon.in", "r", stdin);
	freopen("zvon.out", "w", stdout);
	scanf("%d\n", &t);
	for (int I=1; I<=t; I++)
	{
		readNext();
		Rez=rez(rad);
		printf("%ld\n", Rez);
		stergeVect();
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

void readNext()
{
	long x, y;
	scanf("%ld\n", &n);
	for (i=1; i<n; i++)
	{
		scanf("%ld %ld\n", &x, &y);
		list q=new nod;
		q->inf=y;
		if (gr[x])
		{
			q->urm=gr[x];
			gr[x]=q;
			nrFii[x]++;
		}
		else
		{
			gr[x]=new nod;
			gr[x]->inf=y;
			gr[x]->urm=NULL;
			nrFii[x]=1;
		}

		radPos[y]=1;
	}
	for (i=1; i<=n & radPos[i]; i++);
	rad=i;
}

void stergeVect()
{
	list p;
	for (i=1; i<=n; i++)
	{
		while (gr[i])
		{
			list q=gr[i];
			gr[i]=gr[i]->urm;
			delete q;
		}
		radPos[i]=0;
		nrFii[i]=0;
	}
}

long rez(long x)
{
	long temp=0, maxim=0;
	list p;
	if (!gr[x]) return 0;
	else
	{
		nrd++;
		d[nrd]=new long [nrFii[x] + 3]; //(long *)realloc(d[nrd],(nrFii[x]+3)*sizeof(long));
		for (p=gr[x]; p; p=p->urm)
			d[nrd][++temp]=rez(p->inf);
		qSort(1,temp);
		for (i=1; i<=temp; i++)
			maxim=max(maxim,d[nrd][i]+temp-i+1);
		delete d[nrd];
		nrd--;
		return maxim;
	}
}

long divide(long p, long q)
{
	long st=p, dr=q, x=d[nrd][p];
	while (st < dr)
	{
		while ( st<dr && d[nrd][dr]>=x ) dr--;
		d[nrd][st]=d[nrd][dr];
		while ( st<dr && d[nrd][st]<=x ) st++;
		d[nrd][dr]=d[nrd][st];
	}
	d[nrd][st]=x;
	return st;
}

void qSort(long p, long q)
{
	long m=divide(p,q);
	if (m-1>p) qSort(p, m-1);
	if (m+1<q) qSort(m+1, q);
}