Cod sursa(job #103802)

Utilizator cos_minBondane Cosmin cos_min Data 15 noiembrie 2007 17:23:11
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 2.07 kb
#include <stdio.h>
#include <fstream>
#include <vector>
#include <set>
using namespace std;

#define in "zvon.in"
#define out "zvon.out"
#define dim 100066

int T, N, M, Q, K;
int Vec[dim];
bool Sel[dim], Sel2[dim];

vector<int> L[dim];

struct Compare {
       bool operator() (const int &i, const int &j) const
       {
            return ( Vec[i] < Vec[j] );
       }
};

void DF(int);
void Solve(int,int);

int main()
{
    int X, Y, j;
    char linie[25];
    
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d", &T);
    for ( ; T > 0; T-- )
    {
        scanf("%d", &N);
        
        memset(Sel,0,sizeof(Sel)); memset(Vec,0,sizeof(Vec)); memset(Sel2,0,sizeof(Sel2));
        
        for ( int i = 1; i <= N; i++ ) L[i].clear();
        
        if ( N == 1 ) 
        {
             printf("0\n");
             continue;
        }
        
        for ( int i = 1; i <= N-1; i++ )
        {
            scanf("%d%d", &X, &Y), L[X].push_back(Y);
        }
        
        DF(1);
        
        for ( int i = 1; i <= N; i++ )
            if ( L[i].size() > 1 ) sort(L[i].begin(), L[i].end(), Compare() );
        
        Q = 0;
        
        Solve(1,0);
        
        printf("%d\n", Q);
    }
    
    /*
    printf("1\n%d\n", 100000);
    
    for ( int i = 2; i <= 100000; i++ )
    {
        if ( i % 2 == 0 ) printf("1 %d\n", i);
        else              printf("2 %d\n", i);
    }*/
        
    return 0;
}

void Solve(int nod, int timp)
{
     Sel2[nod] = 1;
     
     if ( Q < timp ) Q = timp;
     
     for ( int i = L[nod].size()-1; i >= 0 ; i-- )
     {
          if ( !Sel2[L[nod][i]] ) K = L[nod].size()-1-i, Solve(L[nod][i],timp+K+1);
     }
}

void DF(int nod)
{
     Sel[nod] = 1;
     
     for ( int i = 0; i < L[nod].size(); i++ )
     {
         if ( !Sel[L[nod][i]] )
         {
              DF(L[nod][i]);
              
              Vec[nod] += Vec[L[nod][i]] + 1;
         }
     }
     
     if ( L[nod].size() == 0 ) Vec[nod] = 0;
}