Cod sursa(job #210871)

Utilizator RobybrasovRobert Hangu Robybrasov Data 29 septembrie 2008 19:41:40
Problema Zvon Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.02 kb
type    adr=^noduri;
        noduri=record val:longint; urm:adr; end;
var     {
         S - valorile sortate
         T - timpi
         L - liste
         E - existenta (pentru dfs)
         V - valori (cati "subordonati" are fiecare nod)
        }
        L:array[1..100010] of adr;
        V,T,S:array[1..100010] of longint;
        E:array[1..100010] of boolean;
        n,i,j,k2,max:longint;
        x,k1:byte;
        p:adr;
        f,g:text;

function poz(a,b:longint):longint;
var i,j:shortint;
    t:longint;
begin
  i:=0; j:=-1;
  while a<b do
    begin
      if v[S[a]]<v[S[b]] then
        begin
          t:=S[a]; S[a]:=S[b]; S[b]:=t;
          t:=i; i:=-j; j:=-t;
        end;
      inc(a,i); inc(b,j);
    end;
  poz:=a;
end;

procedure sort(a,b:longint);
var m:longint;
begin
  if a<b then
    begin
      m:=poz(a,b);
      sort(a,m-1);
      sort(m+1,b);
    end;
end;

procedure df(nod:longint);
var p:adr;
begin
  E[nod]:=true;
  p:=L[nod];
  while p<>nil do
    begin
      if not E[p^.val] then df(p^.val);
      inc(v[nod],v[p^.val]);
      p:=p^.urm;
    end;
end;

procedure zvon(nod:longint);
var p:adr; k,i:longint;
begin
  p:=L[nod];
  k:=0;
  while p<>nil do
    begin
      inc(k);
      S[k]:=p^.val;
      p:=p^.urm;
    end;
  sort(1,k);
  for i:=1 to k do
    begin
      T[S[i]]:=T[nod]+i;
      if T[S[i]]>max then max:=T[S[i]];
    end;
  for i:=1 to k do zvon(S[i]);
end;

begin
  assign(f,'zvon.in');
  reset(f);
  assign(g,'zvon.out');
  rewrite(g);
  readln(f,x);
  for k1:=1 to x do
    begin
      readln(f,n);
      for i:=1 to n do
        begin
          L[i]:=nil;
          E[i]:=false;
          V[i]:=0;
        end;
      for k2:=1 to n-1 do
        begin
          readln(f,i,j);
          inc(v[i]);
          new(p);
          p^.val:=j; p^.urm:=L[i];
          L[i]:=p;
        end;
      df(1);
      T[1]:=0;
      max:=0;
      zvon(1);
      writeln(g,max);
    end;
  close(f);
  close(g);
end.