Cod sursa(job #105468)

Utilizator CezarMocanCezar Mocan CezarMocan Data 17 noiembrie 2007 18:34:41
Problema Zvon Scor 0
Compilator fpc Status done
Runda Happy Coding 2007 Marime 2.31 kb
type vector=array[0..100010]of longint;
var n,i,j,k,tt:longint;
    ind,id,v,max,nrmax,x,y,t,nr:vector;

procedure qsort(ls,ld:longint);
var i,j,aux:longint;
begin
  i:=ls;j:=ld;
  while true do begin
    while (nr[i]>=nr[j])and(i<>j) do inc(i);
    if i=j then break;
    aux:=nr[i];nr[i]:=nr[j];nr[j]:=aux;dec(j);
    while (nr[i]>=nr[j])and(i<>j) do dec(j);
    if i=j then break;
    aux:=nr[i];nr[i]:=nr[j];nr[j]:=aux;inc(i);
  end;
  if j-1>ls then qsort(ls,j-1);
  if j+1<ld then qsort(j+1,ld);
end;


procedure df(nod:longint);
var i,j,p1,p2,aux:longint;
begin
for i:=ind[nod]+1 to ind[nod+1] do
        begin
        df(v[i]);
{        inc(nr[t[v[i]]]);
        if t[v[i]]=max[nod] then
                inc(nrmax[nod]);
        if t[v[i]]>max[nod] then
                begin
                max[nod]:=t[v[i]];
                nrmax[nod]:=1;
                end;}
        end;
fillchar(nr,sizeof(nr),0);
for i:=ind[nod]+1 to ind[nod+1] do
        begin
        inc(nr[0]);
        nr[nr[0]]:=t[v[i]];
        end;
for i:=1 to nr[0] do
        begin
        p1:=random(nr[0])+1;
        p2:=random(nr[0])+1;
        aux:=nr[p1];
        nr[p1]:=nr[p2];
        nr[p2]:=aux;
        end;
if nr[0]>0 then
        qsort(1,nr[0]);
for i:=1 to nr[0] do
        if nr[i]+i>t[nod] then
                t[nod]:=nr[i]+i;
end;


begin
assign(input,'zvon.in');reset(input);
assign(output,'zvon.out');rewrite(output);
randomize;
readln(tt);
for k:=1 to tt do
        begin
        readln(n);
        for i:=2 to n do
                begin
                readln(x[i],y[i]);
                inc(ind[x[i]]);
                end;
        for i:=2 to n do
                ind[i]:=ind[i-1]+ind[i];
        for i:=n downto 1 do
                ind[i]:=ind[i-1];
        for i:=2 to n do
                begin
                inc(id[x[i]]);
                v[ind[x[i]]+id[x[i]]]:=y[i];
                end;
        ind[n+1]:=ind[n]+id[n];
        if n<>1 then
                df(1);
        writeln(t[1]);
        for i:=0 to 100010 do
                begin
                max[i]:=0;
                nrmax[i]:=0;
                v[i]:=0;
                ind[i]:=0;
                id[i]:=0;
                nr[i]:=0;
                t[i]:=0;
                end;
        end;
end.