Pagini recente » Cod sursa (job #1809721) | Cod sursa (job #1415724) | Cod sursa (job #1887302) | Cod sursa (job #337731) | Cod sursa (job #109064)
Cod sursa(job #109064)
//100 puncte
#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 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] = 0; // 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);
for (i = 1; i <= 100; ++i)
sub[i] = rand () % 100;
sort (100);
while (Ts)
{
memset (T, 0, sizeof (T));
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;
}