Cod sursa(job #119484)

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

using namespace std;

int teste, nrt, n, nr[lg], *v[lg], tr[lg], tata, rz, a, b, i, cm[lg];
struct vector{
	int n, v;
};
vector q[lg];
int cmp(vector a, vector b){
	if (a.v != b.v)
		return (a.v > b.v);
	return 0;
}
void dtr(int nod, int str){
	int i;
	
	for (i=1; i<=nr[nod]; i++)
		dtr(v[nod][i], nod);
	
	cm[nod] += nr[nod];
	cm[str] += cm[nod];
}
void df(int nod, int val){
	int i;
	if (!nr[nod]){
		rz = max(rz, val);
		return ;
	}
	
	int ind = 0;
	for (i = 1; i <= nr[nod]; i ++)
		q[++ind].n = v[nod][i], q[ind].v = cm[v[nod][i]];
	

	sort(q+1, q+nr[nod]+1, cmp);
	
	for (i = 1; i <= nr[nod]; i ++)
		df(q[i].n, i+val);
}
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, cm[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;
			}
		
		dtr(tata, 0);
		
		rz = 0;
		df(tata, 0);
		
		printf("%d\n", rz);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}