Cod sursa(job #107654)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 20 noiembrie 2007 08:54:21
Problema Zvon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
/* Ivan Nicolae - Bucuresti */
/* Infoarena - Zvon */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NMAX 101
#define _fin  "zvon.in"
#define _fout "zvon.out"

struct node
{
 int key;
 node* next;
};

int i,n,m,j,TMIN[NMAX],TFMIN[NMAX],t;
node* A[NMAX],* Sf[NMAX];

void Insert(node*& R, node*& Sf, int x)
{
 if (!R)
   {
    R=(node*)malloc(sizeof(node));
    R->key=x;
    R->next=0;
    Sf=R;
   }
   else {
	 node* e=(node*)malloc(sizeof(node));
	 e->key=x;
	 e->next=0;
	 Sf->next=e;
	 Sf=e;
	}
}

void Quick(int li, int ls)
{
 int i=li,j=ls,x=TFMIN[(li+ls)>>1],y;
 while (i<=j)
      {
       while (TFMIN[i]>x) i++;
       while (TFMIN[j]<x) j--;
       if (i<=j)
	 {
	  y=TFMIN[i]; TFMIN[i]=TFMIN[j]; TFMIN[j]=y;
	  i++;j--;
	 }
      }
 if (i<ls) Quick(i,ls);
 if (li<j) Quick(li,j);
}

void DFS(int nod)
{
 int i;

 node* x=A[nod];
 while (x)
      {
       DFS(x->key);
       x=x->next;
      }

 x=A[nod];
 TFMIN[0]=0;
 while (x)
      {
       TFMIN[++TFMIN[0]]=TMIN[x->key];
       x=x->next;
      }

 Quick(1,TFMIN[0]);

 int max=0;
 for (i=1;i<=TFMIN[0];i++)
    if (i+TFMIN[i]>max)
      max=i+TFMIN[i];
 TMIN[nod]=max;
}

int main()
{
 freopen(_fin,"r",stdin);
 freopen(_fout,"w",stdout);


 scanf("%d",&t);
 for (;t>=1;t--)
    {
     scanf("%d",&n);
     memset(A,0,sizeof(A));
     memset(Sf,0,sizeof(Sf));
     memset(TMIN,0,sizeof(TMIN));
     memset(TFMIN,0,sizeof(TFMIN));
     for (i=1;i<=n-1;i++)
	{
	 int x,y;
	 scanf("%d%d",&x,&y);
	 Insert(A[x],Sf[x],y);
	}

     DFS(1);

     printf("%d\n",TMIN[1]);
    }

 fclose(stdin);
 fclose(stdout);
 return 0;
}