Cod sursa(job #194143)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 8 iunie 2008 16:02:05
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n, nr[100005], t, a[100005], zvon[100005], max;

typedef struct nod
{
	int x; 
	nod *a;
} *pNod;
pNod v[100005];

int cmp(const void *x, const void *y)
{
	int i = *(int *)x, j = *(int *)y;
	return nr[a[j]] - nr[a[i]];
}

void add(pNod &p, int x)
{
	pNod q;
	q = new nod;
	q -> x = x;
	q -> a = p;
	p = q;
}

void initializari()
{
	int i;
	for (i = 1; i <= n; i++) v[i] = NULL, nr[i] = zvon[i] = a[i] = 0;;
	max = 0;
}

void DF(int nod)
{
	pNod p;
	nr[nod]++;
	for (p = v[nod]; p != NULL; p = p -> a)
	{
		DF(p -> x);
		nr[nod] += nr[p -> x];
	}
}

void DF2(int nod, int niv)
{
	pNod p;
	int x = 0, ord[100005], i;
	for (p = v[nod]; p != NULL; p = p -> a) a[++x] = p -> x, ord[x] = x;
	qsort(ord, x + 1, sizeof(int), cmp);
	for (i = 1; i <= x; i++)
	{
		zvon[a[i]] = zvon[nod] + ord[i];
		if (max < zvon[a[i]]) max = zvon[a[i]];
	}
        for (i = 1; i <= x; i++) DF2(a[i], zvon[a[i]]);
}



int main()
{
	freopen("zvon.in","r",stdin);
	freopen("zvon.out","w",stdout);

	int i, x, y;
	
	scanf("%d",&t);
	while (t--)
	{
		scanf("%d",&n);
		initializari();
		for (i = 1; i < n; i++)
		{
			scanf("%d %d",&x,&y);
			add(v[x],y);
		}
		DF(1);
		DF2(1,0);
		printf("%d\n",max);
	}
	return 0;
}