Cod sursa(job #132254)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 5 februarie 2008 15:11:16
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
struct Nod  {
  int info;
  Nod *urm;
};
int t,i,n,j,x,y;
Nod *st[200002],*fin[200002],*q;
int tplgc[200001],d[200001],f[200001],viz[200001],tm,sir[200001],nr,max;
int insert(Nod *&ultim, int val)
{
  Nod *p= new Nod;
  p->info=val;
  ultim->urm=p;
  p->urm=NULL;
  ultim=p;
}
int df(int s)
{
  Nod *i;
  tm++;
  viz[s]=1;
  d[s]=tm;
  for(i=st[s];i!=NULL;i=i->urm)
    if (!viz[i->info])
      df(i->info);
  f[s]=tm;
  tplgc[tplgc[0]--]=s;
  return 0;
}
int main()
{
  freopen("zvon.in","r",stdin);
  freopen("zvon.out","w",stdout);
  scanf("%ld",&t);
  for(i=1;i<=t;i++)
     {
      scanf("%ld",&n);
      tplgc[0]=n;
      for(j=1;j<n;j++)
       {
         scanf("%ld %ld",&x,&y);
         if (st[x]->info==0) {insert(st[x],y);fin[x]=st[x];}
            else insert(fin[x],y);
       }
       tm=0;
       df(1);
     max=-1;
     nr=0;
     for(j=n;j>0;j--)
     {
       for(q=st[tplgc[j]];q!=NULL;q=q->urm)
       {
         if (max<f[q->info]-d[q->info])
           {
           max=f[q->info]-d[q->info];
           nr=0;
           }
         if (max==f[q->info]-d[q->info]) nr++;
       }
         sir[j]=max+nr;
      }
      if (sir[1]==-1) sir[1]=0;
      printf("%ld\n",sir[1]);
       for(j=1;j<=n;j++)
          {
          viz[j]=0;
          st[j]=NULL;
          fin[j]=NULL;
          }
     }
  return 0;
}