Cod sursa(job #1649858)

Utilizator Stefan.Andras Stefan Stefan. Data 11 martie 2016 15:24:45
Problema Diametrul unui arbore Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.49 kb
program diam;
const Nmax = 100005;
      Mmax = 100005;
type vector = array[1..Nmax] of longint;
var f, g:text;
    t:array[0..1,1..2 * Mmax] of longint;
    i, j, k, n, last, max:longint;
    viz:array[1..Nmax] of boolean;
    dist1, start, coada:vector;
    bufin, bufout:array[1..1 shl 16] of char;

procedure calc(nod:longint; dist:vector);
var p, u, z, i:longint;
begin
   p := 1; u := 1;
   coada[p] := nod;
   dist[nod] := 1;
   while p <= u do
      begin
         z := start[coada[p]];
         while z <> 0 do
            begin
               if dist[t[0, z]] = 0 then
                  begin
                     inc(u);
                     coada[u] := t[0, z];
                     dist[t[0, z]] := dist[coada[p]] + 1;
                  end;
               z := t[1, z];
            end;
         inc(p);
      end;
   max := 0;
   for i := 1 to n do
      if dist[i] > max then
         begin
            max := dist[i]; last := i;
         end;
end;

begin
   assign(f, 'darb.in'); reset(f);
   assign(g, 'darb.out'); rewrite(g);
   settextbuf(f, bufin); settextbuf(f, bufout);
   readln(f, n);
   for k := 1 to n - 1 do
      begin
         readln(f, i, j);
         t[0, k * 2 - 1] := j;
         t[1, k * 2 - 1] := start[i];
         start[i] := k * 2 - 1;
         t[0, k * 2] := i;
         t[1, k * 2] := start[j];
         start[j] := k * 2;
      end;

   calc(1, dist1);
   calc(last, dist1);
   writeln(g, max);

   close(f); close(g);
end.