Cod sursa(job #130565)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 1 februarie 2008 15:32:54
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#define inf 1000000000

using namespace std;

long t,n,i,x,y,q[100003];
long niv[100003],d[100003];
vector<long> l[100003];
vector<long> v(100003);

long dfs(long x){
     long maxim=0;
     long i,a;
     
     if (q[x]>-1){
         for (i=0;i<=q[x];i++){
             a=dfs(l[x][i]);
             if (a>maxim)maxim=a;
         }
         niv[x]=maxim+1;
     }
     else niv[x]=1;
     return niv[x];
}

int comp(const void *n1,const void *n2){
    return (long)(v[*((long*)n2)]-v[*((long*)n1)]);
}

void drum(long x,long timp){
     d[x]=timp;
     const long lung=q[x]+1;
     long i,ind[lung];
     for (i=0;i<=q[x];i++){
         ind[i]=i;
         v[i]=niv[l[x][i]];
     }
     if (q[x]>-1)qsort(ind,lung,sizeof(long),comp);

     for (i=0;i<=q[x];i++){
         drum(l[x][ind[i]],timp+i+1);
     }
}

int main(){
    freopen("zvon.in","r",stdin);
    freopen("zvon.out","w",stdout);
    
    long maxim;
    
    scanf("%ld",&t);
    for (;t;t--){
        scanf("%ld",&n);
        for (i=1;i<=n;i++){q[i]=-1;l[i].clear();}
        for (i=1;i<n;i++){
            scanf("%ld %ld",&x,&y);
            q[x]++;
            l[x].push_back(y);
        }
        dfs(1);
        /*for (i=1;i<=n;i++)
            printf("%ld ",niv[i]);
        printf("\n");
        */
        drum(1,0);
        maxim=0;
        for (i=1;i<=n;i++)
            if (d[i]>maxim)maxim=d[i];
        printf("%ld\n",maxim);
    }
    
    return 0;
    
}