Cod sursa(job #123300)

Utilizator DastasIonescu Vlad Dastas Data 15 ianuarie 2008 14:32:26
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <algorithm>

const int maxn = 100001;

FILE *in = fopen("zvon.in","r"), *out = fopen("zvon.out","w");

struct muchii
{
    int x, y;
};

int t;
int n;
int *a[maxn];

muchii b[maxn];

int tmin[maxn];
int nr[maxn];

void readcase()
{
    fscanf(in, "%d", &n);

    for ( int i = 1; i <= n; ++i )
        nr[i] = 0, tmin[i] = 0;

    for ( int i = 1; i < n; ++i )
        fscanf(in, "%d %d", &b[i].x, &b[i].y), ++nr[ b[i].x ];

    for ( int i = 1; i <= n; ++i )
        a[i] = new int[ nr[i] + 2 ], a[i][0] = 0;

    for ( int i = 1; i < n; ++i )
        a[ b[i].x ][ ++a[ b[i].x ][0] ] = b[i].y;
}

int cmp(const int &p, const int &q)
{
    return p > q;
}

void df(int nod = 1)
{
    // daca e frunza
    if ( a[nod][0] == 0 )
    {
        a[nod] = 0;
        return;
    }

    // altfel continua parcurgerea
    for ( int i = 1, N = a[nod][0]; i <= N; ++i )
        df(a[nod][i]);

    // sorteaza fii descrescator dupa tmin
    std::sort(a[nod] + 1, a[nod] + a[nod][0] + 1, cmp);

    // calc tmin[nod]
    int max = -1;
    for ( int i = 1, N = a[nod][0]; i <= N; ++i )
        if ( i + tmin[ a[nod][i] ] > max )
            max = i + tmin[ a[nod][i] ];

    tmin[nod] = max;
}

int main()
{
    fscanf(in, "%d", &t);

    while ( t-- )
    {
        readcase();
        df();

        fprintf(out, "%d\n", tmin[1]);
    }
	return 0;
}