Cod sursa(job #109056)

Utilizator floringh06Florin Ghesu floringh06 Data 24 noiembrie 2007 16:12:44
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#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;
    }