Cod sursa(job #128015)

Utilizator Data 25 ianuarie 2008 20:42:36
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
struct nod{long info; nod* next;};
long n,i,j,t,max,v1,v2,nm,ct,vl,valo,k;
nod *tati[100001],*nivel[100001];
long tmin[100001],niv[100001],fii[100001];
FILE*f=fopen("zvon.in","r");
FILE*g=fopen("zvon.out","w");
long part(long st, long dr)
{ 
 long i=st,j=dr,s=-1,aux;
 while (i<j)
   {
    if (fii[i]<fii[j])
      {
       aux=fii[i];
       fii[i]=fii[j];
       fii[j]=aux;
       s=-s;
      }
    if (s==1) i++;
         else j--;
   }
 return i;
}
void qsort(long st, long dr)
{
 long p;
 if (st<dr)
   {
    p=part(st,dr);
    qsort(st,p-1);
    qsort(p+1,dr);
   }
}
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=0;
 qin(nivel[1],1);
 for (i=1; i<=n-1; i++)
   {
    fscanf(f,"%ld%ld",&v1,&v2);
    qin(tati[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 (tati[vl]!=NULL)
         {
          qout(tati[vl],valo);
          ct++;
          fii[ct]=valo;
         }
       qsort(1,ct);
       max=-50000;
       for (j=1; j<=ct; j++)
         if (tmin[fii[j]]+j>max) max=tmin[fii[j]]+j;
       tmin[vl]=max;
      }           
   }
 fprintf(g,"%ld\n",tmin[1]);
 if (nivel[1]!=NULL) qout(nivel[1],vl);
}
int main()
{
 fscanf(f,"%ld",&t);
 for (k=1; k<=t; k++)
   solv();
 return 0;
}