Cod sursa(job #91736)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 13 octombrie 2007 12:47:24
Problema Zvon Scor Ascuns
Compilator cpp Status done
Runda Marime 1.44 kb
#include <stdio.h>
#include <string.h>

#include <vector>
#include <algorithm>
using namespace std;

#define NMAX 100100

int q[NMAX], tmin[NMAX], sz[NMAX], len[NMAX];
char viz[NMAX];
vector<int> f[NMAX];
vector<pair<int, int> > tf;
int i, j, k, N, le, ri, n;

void compute(int n)
{
	int tc;

	tmin[n] = 0;
	len[n] = 0;
	sz[n] = 1;

	tf.clear();
	for (i = 0; i < f[n].size(); i++)
	{
		if (len[f[n][i]] > len[n])
			len[n] = len[f[n][i]];

		sz[n] += sz[f[n][i]];

		tf.push_back(make_pair(len[f[n][i]], f[n][i]));
	}

	len[n]++;

	sort(tf.begin(), tf.end());

	for (i = f[n].size() - 1, tc = 1; i >= 0; i--, tc++)
		if (tc + tmin[tf[i].second] > tmin[n])
			tmin[n] = tc + tmin[tf[i].second];
}

int main()
{
	int T;

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

	scanf("%d", &T);

	while (T--)
	{
		scanf("%d", &N);

		memset(f, 0, sizeof(f));

		// read the edges

		for (k = 1; k < N; k++)
		{
			scanf("%d %d", &i, &j);
			f[i].push_back(j);
		}

		// BF on the tree, starting from node 1

		memset(viz, 0, sizeof(viz));

		q[le = ri = 1] = 1;
		viz[1] = 1;

		while (le <= ri)
		{
			n = q[le];

			for (i = 0; i < f[n].size(); i++)
			{
				j = f[n][i];

				if (!viz[j])
				{
					ri++;
					q[ri] = j;
					viz[j] = 1;
				}
			}

			le++;
		}

		for (j = N; j >= 1; j--)
			compute(q[j]);

		printf("%d\n", tmin[1]);
	}
	
	return 0;
}