Cod sursa(job #129149)

Utilizator Data 28 ianuarie 2008 18:09:01
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 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;
}