Cod sursa(job #352440)

Utilizator laserbeamBalan Catalin laserbeam Data 1 octombrie 2009 19:23:07
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
// Catalin Balan
// Thu Oct  1 18:24:22 EEST 2009
// Zvon - Infoarena

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;

#define	NMAX 100002
#define CHUNK 8192

#define FIN "zvon.in"
#define FOUT "zvon.out"

char g_buf[CHUNK];
int g_p=CHUNK-1;

inline int get(FILE *f)
{

	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) {  fread(g_buf,1,CHUNK,f); g_p=0;  }

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9') {
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK)  {  fread(g_buf,1,CHUNK,f); g_p=0;  }
	}
	return x;
}


vector<int> tree[NMAX];
int answ[NMAX];
int auxV[NMAX];
int n;
void solve(int node)
{
	int i,nr,cost;
	nr = tree[node].size();
	for (i = 0; i < nr; ++i)
	{
		solve(tree[node][i]);
	}
	for (i = 0; i < nr; ++i)
	{
		auxV[i]=answ[tree[node][i]];
	}
	sort(auxV,auxV+nr);
	answ[node]=0;
	for (i = nr-1, cost = 1; i >= 0; --i, ++cost)
	{
		if (answ[node]<cost+auxV[i])answ[node]=cost+auxV[i];
	}
	
}

int main(int argv, char ** argc)
{
	FILE *f = fopen(FIN, "r");
	FILE *g = fopen(FOUT, "w");

	int t,i,a,b;
	t = get(f);
	for (int test = 1; test<= t; ++test)
	{

		n = get(f);
		for (i = 1; i <= n; ++i)
			tree[i].clear();
		for (i = 1; i < n; ++i)
		{
			a = get(f);
			b = get(f);
			tree[a].push_back(b);
		}

		solve(1);
		fprintf(g,"%d\n",answ[1]);
	}

	fclose(f);
	fclose(g);
	return EXIT_SUCCESS;
}