Nu aveti permisiuni pentru a descarca fisierul grader_test11.ok

Cod sursa(job #146471)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 1 martie 2008 19:29:39
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10001
int *a[N];
int n;
struct dublet //:))
{
	int x,y;
};
dublet d[N];
int subord[N];
void df(int);
int compara(const void* a, const void* b)
{
	return (subord[*((int*)b)]-subord[*((int*)a)]);
}
int timp(int x)
{
	int max=0,tc;
	for(int i=1;i<=a[x][0];++i)
	{
		tc=timp(a[x][i])+i;
		if(tc>max) max=tc;
	}
	return max;
}
inline void rezolva_test()
{
	
	scanf("%d",&n);
	if(n==1)
	{
		printf("0\n");
		return;
	}
	int i;
	int v[N]={0};
	for(i=1;i<=n-1;++i)
	{
		scanf("%d%d",&d[i].x,&d[i].y);
		++v[d[i].x];
	}
	for(i=1;i<=n;++i)
	{
		a[i]=new int[v[i]+1];
		a[i][0]=0;
	}
	for(i=1;i<=n-1;++i)
	{
		a[d[i].x][++a[d[i].x][0]]=d[i].y;
	}
	//am creat listele de adiacenta;

	df(1);
	//creez vectorul in care numar subordonatii fiecarui angajat :D
	for(i=1;i<=n;++i)
	{
		qsort(a[i]+1,a[i][0],sizeof(int),compara);
	}
	printf("%d\n",timp(1));
	for(i=1;i<=n;i++)
	{
		delete(a[i]);
	}
	memset(subord,0,sizeof(int)*N);
}
void df(int x)
{
	int i;
	
	for(i=1;i<=a[x][0];++i)
	{
		df(a[x][i]);
		subord[x]+=subord[a[x][i]];
	}
	subord[x]++;
}
int main()
{
	int t;
	freopen("zvon.in","r",stdin);
	freopen("zvon.out","w",stdout);
	scanf("%d",&t);
	for(int tc=0;tc<t;++tc) rezolva_test();
	fclose(stdin);
	fclose(stdout);
	return 0;
}