Cod sursa(job #312424)

Utilizator FlorianFlorian Marcu Florian Data 5 mai 2009 22:29:56
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
#define MAX_N 100003
int NR[MAX_N];
vector<int>G[MAX_N];
int N,T,S;
int viz[MAX_N];
int Timp[MAX_N], sol;
struct Lista
{
	int nod, nr;
};
void dfs(int x)
{
	int i;
	if(NR[x]) return;
	NR[x] = 1;
	for(i=0;i<G[x].size();++i)
	{
		dfs(G[x][i]);
		NR[x] += NR[G[x][i]];
	}
}
struct cmp
{
        bool operator()(const Lista &a,const Lista &b)const
        {
            return (a.nr > b.nr);
		}
};
void df(int x)
{
	int i,y;
	if(viz[x]) return;
	viz[x] = 1;
	vector<Lista> L;
	Lista q;
	for(i = 0; i<G[x].size(); ++i)
	{
		q.nr = NR[G[x][i]]; q.nod = G[x][i];
		L.push_back(q);
	}
	sort(L.begin(),L.end(), cmp());
	for(i = 0; i<L.size(); ++i)
	{
		y = L[i].nod;
		Timp[y] = Timp[x] + i + 1;
	}
	for( i=0; i<G[x].size(); ++i) df(G[x][i]);
}

	
void solve()
{
	int i;
	for(i=1;i<=N;++i) G[i].clear();
	scanf("%d",&N);
	int x,y;
	memset(viz,0,sizeof(viz));
	memset(Timp,0,sizeof(Timp));
	for(i=1;i<N;++i)
	{
		scanf("%d%d",&x,&y);
		G[x].push_back(y);
	}
	memset(NR,0,sizeof(NR));
	dfs(1); sol = -1;
	df(1);
	for(i=1;i<=N;++i) if(sol < Timp[i]) sol = Timp[i];
	printf("%d\n",sol);
}
int main()
{
	N = 0;
	freopen("zvon.in","r",stdin);
	freopen("zvon.out","w",stdout);
	scanf("%d",&T);
	while(T--) solve();
	return 0;
}