Cod sursa(job #104631)

Utilizator ProtomanAndrei Purice Protoman Data 16 noiembrie 2007 14:58:30
Problema Zvon Scor 0
Compilator fpc Status done
Runda Happy Coding 2007 Marime 2.47 kb
type point=^nod;
     nod=record
         n:longint;
         ua:point;
     end;
     vector=array[1..100010] of longint;

var f1,f2:text;
    i,j,t,n,ii,jj,dimh:longint;
    q:point;
    l:array[1..100010] of point;
    v,a:vector;

procedure repair(i:longint);
var l,r,max,aux:longint;
begin
        l:=2*i;
        r:=l+1;
        max:=i;
        if (l<=dimh)and(a[l]>a[max]) then
                max:=l;
        if (r<=dimh)and(a[r]>a[max]) then
                max:=r;
        if max<>i then
        begin
                aux:=a[i];
                a[i]:=a[max];
                a[max]:=aux;
                repair(max);
        end;
end;

procedure buildheap(h:longint);
var i:longint;
begin
        for i:=h div 2 downto 1 do
                repair(i);
end;

procedure heapsort(h:longint);
var i,aux:longint;
begin
        buildheap(h);
        for i:=h downto 2 do
        begin
                aux:=a[1];
                a[1]:=a[i];
                a[i]:=aux;
                dec(dimh);
                repair(1);
        end;
end;

procedure afla(x:longint);
var i,j,m,h,aux,r,max:longint;
    p:point;
    s:array[1..100010] of longint;
begin
        max:=0;
        h:=0;
        p:=l[x];
        while p<>nil do
        begin
                inc(h);
                m:=p^.n;
                if v[m]=-1 then
                        afla(m);
                s[h]:=v[m]+1;
                p:=p^.ua;
        end;
        for i:=1 to h do
                a[i]:=s[i];
        dimh:=h;
        heapsort(h);
        for i:=1 to h do
                s[i]:=a[i];
        r:=0;
        s[0]:=0;
        for i:=h downto 0 do
        begin
                if s[i]+r>max then
                        max:=s[i]+r;
                inc(r);
        end;
        l[x]:=nil;
        v[x]:=max;
end;

begin
        assign(f1,'zvon.in');
        reset(f1);
        assign(f2,'zvon.out');
        rewrite(f2);
        read(f1,t);
        for j:=1 to t do
        begin
                read(f1,n);
                for i:=1 to n-1 do
                begin
                        v[i]:=-1;
                        read(f1,ii,jj);
                        new(q);
                        q^.ua:=l[ii];
                        q^.n:=jj;
                        l[ii]:=q;
                end;
                v[n]:=-1;
                afla(1);
                writeln(f2,v[1]);
        end;
        close(f1);
        close(f2);
end.