Cod sursa(job #109064)

Utilizator floringh06Florin Ghesu floringh06 Data 24 noiembrie 2007 16:41:47
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
//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;
    }