Cod sursa(job #129128)

Utilizator tErMyAndrei Panturu tErMy Data 28 ianuarie 2008 18:01:41
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
 #include <stdio.h>  
 struct nod {long info; nod *next;};  
 FILE*f=fopen("zvon.in","r");  
 FILE*g=fopen("zvon.out","w");  
 nod *fii[110000],*nivel[110000];  
 long tmin[110000],niv[110000],copii[110000],n,i,j,t,max,v1,v2,k,nm,vl,valo,ct;  
 void heapsort(long n)  
 {  
  long i,j,k,aux;  
  for (i=1; i<=n; i++)  
    {  
     j=i;  
     while ((j >> 1!=0)&&(copii[j >> 1]>copii[j]))  
       {  
        aux=copii[j >> 1];  
        copii[j >> 1]=copii[j];  
        copii[j]=aux;  
        j=j >> 1;  
       }  
    }  
     i=n;  
     while (i>1)  
       {  
        aux=copii[1];  
        copii[1]=copii[i];  
        copii[i]=aux;  
        i--;  
        j=1;  
        while (j>0)  
          {  
           k=2*j;  
           if (k>i) break;  
           if ((k+1<=i)&&(copii[k+1]<copii[k])) k++;  
           if (copii[j]<=copii[k]) break;  
           aux=copii[j];  
           copii[j]=copii[k];  
           copii[k]=aux;  
           j=k;  
          }  
       }  
 }  
 void qin(nod*& first, long vl)  
 {  
  nod* p;  
  p=new nod;  
  p->info=vl;  
  p->next=first;  
  first=p;  
 }  
 void qout(nod*& first, long& vl)  
 {  
  nod* p;  
  vl=first->info;  
  p=first;  
  first=first->next;  
  delete(p);  
 }  
 void solv()  
 {  
  fscanf(f,"%ld",&n);  
  niv[1]=1; nm=1; qin(nivel[1],1);  
  for (i=1; i<=n-1; i++)  
    {  
     fscanf(f,"%ld %ld",&v1,&v2);  
     qin(fii[v1],v2);  
     niv[v2]=niv[v1]+1;  
     qin(nivel[niv[v2]],v2);  
     if (niv[v2]>nm) nm=niv[v2];  
    }  
  for (i=nm-1; i>=1; i--)  
    {  
     while (nivel[i]!=NULL)  
       {  
        qout(nivel[i],vl);  
        ct=0;  
        while (fii[vl]!=NULL)  
          {  
           qout(fii[vl],valo);  
           ct++;  
           copii[ct]=tmin[valo];  
          }  
        heapsort(ct);  
        max=0;  
        for (j=1; j<=ct; j++)  
          if (copii[j]+j>max) max=copii[j]+j;  
        tmin[vl]=max;  
       }  
    }  
  fprintf(g,"%ld\n",tmin[1]);  
  while (nivel[1]!=NULL) qout(nivel[1],vl);  
  while (nivel[nm]!=NULL) qout(nivel[nm],vl);  
 }  
 int main()  
 {  
  fscanf(f,"%ld",&t);  
  for (k=1; k<=t; k++)  
    solv();  
  return 0;  
 }