Cod sursa(job #104280)

Utilizator ProtomanAndrei Purice Protoman Data 16 noiembrie 2007 00:30:23
Problema Zvon Scor 0
Compilator fpc Status done
Runda Happy Coding 2007 Marime 2.41 kb
type point=^nod;
     nod=record
         n:longint;
         ua:point;
     end;
     vector=array[1..10010] of longint;
     vectorm=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:vector;

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

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

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

procedure afla(x:longint);
var i,j,m,h,aux,r,max:longint;
    p:point;
    s:vectorm;
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;
        dimh:=h;
        heapsort(h,s);
        r:=0;
        s[h+1]:=0;
        for i:=h downto 0 do
        begin
                if s[i]+r>max then
                        max:=s[i]+r;
                inc(r);
        end;
        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.