Pagini recente » Cod sursa (job #1985397) | Cod sursa (job #2143172) | Cod sursa (job #2933839) | Cod sursa (job #2276899) | Cod sursa (job #109059)
Cod sursa(job #109059)
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define FIN "zvon.in"
#define FOUT "zvon.out"
#define MAX_N 100005
int *A[MAX_N];
int T[MAX_N];
int V[MAX_N];
int sub[MAX_N];
int N, a, b, i;
int Ts;
void sort(int n)
{
int i,j,k,aux;
for (i=1; i<=n; i++)
{
j=i;
while (j/2 && sub[j/2]>sub[j])
{
aux=sub[j/2];
sub[j/2]=sub[j];
sub[j]=aux;
j>>=1;
}
}
i=n;
while (i>1)
{
aux=sub[i];
sub[i]=sub[1];
sub[1]=aux;
i--;
j=1;
while (1)
{
k=2*j;
if (k>i) break;
if (k+1<=i && sub[k+1]<sub[k]) k++;
if (sub[j]<=sub[k]) break;
aux=sub[k];
sub[k]=sub[j];
sub[j]=aux;
j=k;
}
}
}
void solve (int nod)
{
int i;
if (!A[nod][0]) T[nod] = 1; // frunza
for (i = 1; i <= A[nod][0]; ++i)
solve (A[nod][i]);
for (i = 1; i <= A[nod][0]; ++i)
sub[i] = T[A[nod][i]];
sort (A[nod][0]);
int max = 0;
for (i = 1; i <= A[nod][0]; ++i)
if (i + sub[i] > max) max = i + sub[i];
if (A[nod][0]) T[nod] = max;
}
int main ()
{
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d", &Ts);
while (Ts)
{
memset (T, 0, sizeof (T));
memset (V, 0, sizeof (V));
scanf ("%d", &N);
for (i = 1; i <= N; ++i)
{
A[i] = (int *) realloc (A[i], sizeof(int)); A[i][0] = 0;
}
for (i = 1; i < N; ++i)
{
scanf ("%d %d", &a, &b);
++A[a][0];
A[a] = (int *) realloc (A[a], (A[a][0] + 1)*sizeof(int));
A[a][A[a][0]] = b;
}
if (N != 1)
solve (1);
--Ts;
printf ("%d\n", (int) T[1]);
}
return 0;
}