Cod sursa(job #1597233)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 11 februarie 2016 20:14:20
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#define MAXN 100000
int v[MAXN],next[MAXN],ind[MAXN+1],grad[MAXN+1],timp[MAXN+1],nod[MAXN],F[MAXN];
inline void swap(int b,int e,int *x){
    int aux=x[b];
    x[b]=x[e];
    x[e]=aux;
}
void myqsort(int begin,int end){
    int b=begin,e=end,pivot=F[(b+e)/2];
    while(b<=e){
        while(F[b]<pivot) b++;
        while(F[e]>pivot) e--;
        if(b<=e){
            swap(b,e,F);
            swap(b,e,nod);
            b++;e--;
        }
    }
    if(begin<e) myqsort(begin,e);
    if(b<end) myqsort(b,end);
}
void DFS(int x){
    int poz,n,con,i;
    poz=ind[x];
    n=0;
    while(poz>0){
        F[n]=grad[v[poz]];
        nod[n]=v[poz];
        n++;
        poz=next[poz];
    }
    if(n>0){
       myqsort(0,n-1);
       con=timp[x]+1;
       for(i=n-1;i>=0;i--){
         timp[nod[i]]=con;
         con++;
       }
       poz=ind[x];
       while(poz>0){
          DFS(v[poz]);
          poz=next[poz];
       }
    }
}
inline int cauta(int x){
    int poz;
    if(grad[x]==0){
      poz=ind[x];
      while(poz>0){
        if(grad[v[poz]]==0)
           grad[v[poz]]=cauta(v[poz]);
        grad[x]+=grad[v[poz]];
        poz=next[poz];
      }
    }
    return grad[x];
}
int main(){
    FILE*fi,*fout;
    int t,n,i,max,x,y;
    fi=fopen("zvon.in" ,"r");
    fout=fopen("zvon.out" ,"w");
    fscanf(fi,"%d" ,&t);
    while(t>0){
         t--;
         fscanf(fi,"%d" ,&n);
         for(i=1;i<n;i++){
             fscanf(fi,"%d%d" ,&x,&y);
             next[i]=ind[x];
             ind[x]=i;
             v[i]=y;
         }
         for(i=1;i<=n;i++)
             grad[i]=cauta(i);
         timp[1]=0;
         DFS(1);
         max=0;
         for(i=1;i<=n;i++){
            if(timp[i]>max)
             max=timp[i];
            grad[i]=ind[i]=timp[i]=0;
         }
         fprintf(fout,"%d\n" ,max);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}