Cod sursa(job #130342)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 31 ianuarie 2008 21:04:56
Problema Zvon Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>

#define nmax 110000

struct nod {long info; nod *next;};

FILE*f=fopen("zvon.in","r");
FILE*g=fopen("zvon.out","w");

long n,i,j,t,max,v1,v2,k,nm,vl,valo,ct;

void heapsort(long n);
void solv();

//inserare pe prima pozitie
void qin(nod*& first, long vl)
{
 nod* p;
 p=new nod;
 p->info=vl;
 p->next=first;
 first=p;
}

//eliminare din prima pozitie
void qout(nod*& first, long& vl)
{
 nod* p;
 vl=first->info;
 p=first;
 first=first->next;
 delete(p);
}

nod *fii[nmax],*nivel[nmax];
long tmin[nmax],niv[nmax],child[nmax];
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++;
          child[ct]=tmin[valo];
         }
       heapsort(ct);
       max=0;
       for (j=1; j<=ct; j++)
         if (child[j]+j>max) max=child[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);
}

void heapsort(long n)
{
 long i,j,k,aux;
 for (i=1; i<=n; i++)
   {
    j=i;
    while ((j >> 1!=0)&&(child[j >> 1]>child[j]))
      {
       aux=child[j >> 1]; child[j >> 1]=child[j]; child[j]=aux; j=j >> 1;
      }
   }
    i=n;
    while (i>1)
      {
       aux=child[1]; child[1]=child[i]; child[i]=aux; i--; j=1;
       while (j>0)
         {
          k=2*j;
          if (k>i) break;
          if ((k+1<=i)&&(child[k+1]<child[k])) k++;
          if (child[j]<=child[k]) break;
          aux=child[j]; child[j]=child[k]; child[k]=aux; j=k;
         }
      }
}

int main()
{
 fscanf(f,"%ld",&t);
 for (k=1; k<=t; k++) solv();
 return 0;
}