Cod sursa(job #101111)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 12 noiembrie 2007 23:12:06
Problema Zvon Scor 0
Compilator c Status done
Runda Happy Coding 2007 Marime 1.51 kb
#include <stdio.h>

#define MAX(a,b) (((a)>(b))?(a):(b))
#define NMAX 100100

int N, Case;
int A[NMAX][NMAX], V[NMAX], Viz[NMAX], F[NMAX], Ord[NMAX];

void init()
{
        int i, j;

        for (i = 0; i < NMAX; i++)
        {
                for (j = 0; j < NMAX; j++) A[i][j] = 0;
                V[i] = Viz[i] = F[i] = Ord[i] = 0;
        }
}

void read()
{
        int i, j, k;
        scanf("%d", &N);
        for (k = 1; k < N; k++)
            scanf("%d%d", &i, &j), A[i][j] = 1;
}

void dfs(int i)
{
        int j, k, poz, max;

        for (j = 1; j <= N; j++)
            if (A[i][j]) dfs(j);
        
        for (j = 1; j <= N; j++)
            if (A[i][j]) Viz[j] = 0;

        Ord[0] = 0;
        for (j = 1; j <= N; j++) Ord[j] = Ord[j-1]+A[i][j];
        
        for (j = 1, V[i] = 0; j <= N; j++)
            if (A[i][j])
            {
                  max = 0; poz = 0;
                  for (k = 1; k <= N; k++)
                      if (A[i][k] && !Viz[k] && max<=V[k])
                         max = V[k], poz = k;
                  V[i] = MAX(V[i],max+Ord[j]);
                  Viz[poz] = 1;
            }
}

void solve()
{
        dfs(1);
        printf("%d\n", V[1]);
}

int main()
{
        freopen("zvon.in", "r", stdin);
        freopen("zvon.out", "w", stdout);

        scanf("%d", &Case);
        while (Case--)
        {
              init();
              read();
              solve();
        }
      
        return 0;
         
}