Cod sursa(job #139847)

Utilizator ProtomanAndrei Purice Protoman Data 20 februarie 2008 20:13:01
Problema Zvon Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.51 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,s,q:point;
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);
                new(q);
                q^.ua:=s;
                q^.n:=v[m]+1;
                s:=q;
                p:=p^.ua;
        end;
        for i:=1 to h do
        begin
                a[i]:=s^.n;
                s:=s^.ua
        end;
        dimh:=h;
        heapsort(h);
        r:=0;
        a[0]:=0;
        for i:=h downto 0 do
        begin
                if a[i]+r>max then
                        max:=a[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.