Cod sursa(job #98839)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 10 noiembrie 2007 17:37:40
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.35 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

const int N_MAX = 100010;

vector <int> G[N_MAX];
int dad[N_MAX], nrf[N_MAX], tmp[N_MAX], tp = 0;

int numar(int nod)
{
	vector <int>::iterator it;
	
	for (it = G[nod].begin(); it != G[nod].end(); ++ it) {
		nrf[nod] += (numar(*it) + 1);
	}
	
	return nrf[nod];
}

int cmp(int a, int b)
{
	return (nrf[a] > nrf[b]);
}

int Q[N_MAX];

void timp(int nod)
{
	int in = 1, sf = 2, nd, poz;
	Q[in] = nod;

	vector <int>::iterator it;
	while (in != sf) {
		
		nd = Q[in];
		in ++;
		for (it = G[nd].begin(), poz = 1; it != G[nd].end(); ++ it, poz ++) {
			tmp[*it] = tmp[nd] + poz;
			Q[sf ++] = *it;
		}
	}
}

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

	int T, N, i, a, b, rad = 0, MAX = 0;

	for (scanf("%d\n", &T); T; T --) {
		scanf("%d\n", &N);

		memset(nrf, 0, sizeof(nrf));
		for (i = 1; i <= N; i ++) G[i].clear();

		for (i = 1; i < N; i ++) {
			scanf("%d %d\n", &a, &b);
			dad[b] = a;
			G[a].push_back(b);
		}

		for (i = 1; i <= N; i ++) {
			if (dad[i] == 0) {
				rad = i;
				break;
			}
		}

		nrf[rad] = numar(rad);

		for (i = 1; i <= N; i ++) {
			sort(G[i].begin(), G[i].end(), cmp);
		}

		timp(rad);

		MAX = 0;
		for (i = 1; i <= N; i ++) {
			if (tmp[i] > MAX) MAX = tmp[i];
		}
		printf("%d\n", MAX);
	}

	return 0;
}