Cod sursa(job #119504)

Utilizator andrei.12Andrei Parvu andrei.12 Data 1 ianuarie 2008 16:15:15
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>
#include<algorithm>
#define lg 100005

using namespace std;

int teste, nrt, n, nr[lg], tr[lg], tata, a, b, i, *v[lg], vl[lg];
struct vectr{
	int n, v;
};
vectr q[lg];
int cmp(int a, int b){
	if (a != b)
		return (a > b);
	return 0;
}
void df(int nod){
	int i;
	if (!nr[nod]){
		vl[nod] = 0;
		return ;
	}
	int ind = 0, q[nr[nod]+1];
	
	for (i = 1; i <= nr[nod]; i ++)
		df(v[nod][i]);
	
	for (i = 1; i <= nr[nod]; i ++)
		q[++ind] = vl[v[nod][i]];
	
	sort(q+1, q+ind+1, cmp);
	
	for (i = 1; i <= nr[nod]; i ++)
		vl[nod] = max(vl[nod], i+q[i]);
}
int main()
{
	freopen("zvon.in", "rt", stdin);
	freopen("zvon.out", "wt", stdout);
	
	scanf("%d", &teste);
	
	for (nrt = 1; nrt <= teste; nrt ++){
		scanf("%d", &n);
		
		for (i = 1; i <= n; i ++)
			nr[i] = 0, tr[i] = 0, vl[i] = 0;
		
		for (i = 1; i < n; i ++){
			scanf("%d%d", &a, &b);
			nr[a] ++;
			v[a] = (int*)realloc(v[a], (nr[a]+1)*sizeof(int));
			v[a][nr[a]] = b;
			tr[b] = 1;
		}
		for (i = 1; i <= n; i ++)
			if (!tr[i]){
				tata = i;
				break;
			}
		
		df(tata);
		
		printf("%d\n", vl[1]);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}