Pagini recente » Istoria paginii utilizator/xdberry | Monitorul de evaluare | Istoria paginii runda/omg_am_revenit | Cod sursa (job #173025) | Cod sursa (job #109056)
Cod sursa(job #109056)
#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;
int part (int st, int dr)
{
int i, j, s = 1;
i = st; j = dr;
while (i < j)
{
if (sub[i] < sub[j])
{
int d = sub[i];
sub[i] = sub[j];
sub[j] = d;
s = 1 - s;
}
if (s) ++i; else --j;
}
return i;
}
void sort (int st, int dr)
{
if (st < dr)
{
int p = part (st, dr);
sort (st, p - 1);
sort (p + 1, dr);
}
}
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 (1, 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;
}