Cod sursa(job #129516)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 29 ianuarie 2008 17:23:04
Problema Cerere Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.53 kb
const nmax=100100;
type pelem=^elem;
     elem=record
       info:longint;
       next:pelem;
     end;
var fi,fo:text;
    n,i,v1,v2,fiu,radacina:longint;
    s:array[1..nmax]of byte;
    stramos,rezolv,dist,idist:array[1..nmax]of longint;
    list:array[1..nmax]of pelem;
procedure qin(var first:pelem; vl:longint);
var p:pelem;
begin
  new(p);
  p^.info:=vl;
  p^.next:=first;
  first:=p;
end;
procedure qout(var first:pelem; var vl:longint);
var p:pelem;
begin
  vl:=first^.info;
  p:=first;
  first:=first^.next;
  dispose(p);
end;
procedure df(nod:longint);
var vl,rez:longint;
begin
  s[nod]:=1;
  while list[nod]<>nil do
    begin
      qout(list[nod],vl);
      if s[vl]=0 then
        begin
          s[vl]:=1;
          dist[vl]:=dist[nod]+1;
          idist[dist[vl]]:=vl;
          if stramos[vl]=0 then rezolv[vl]:=0
            else
              begin
                rez:=dist[vl]-stramos[vl];
                rezolv[vl]:=rezolv[idist[rez]]+1;
              end;
          df(vl);
        end;
    end;
end;
begin
  assign(fi,'cerere.in'); reset(fi);
  assign(fo,'cerere.out'); rewrite(fo);
  read(fi,n);
  for i:=1 to n do
    read(fi,stramos[i]);
  read(fi,radacina,fiu);
  qin(list[radacina],fiu);
  qin(list[fiu],radacina);
  for i:=2 to n-1 do
    begin
      read(fi,v1,v2);
      qin(list[v1],v2);
      qin(list[v2],v1);
    end;
  dist[radacina]:=1;
  idist[1]:=radacina;
  df(radacina);
  for i:=1 to n do
    write(fo,rezolv[i],' ');
  close(fi);
  close(fo);
end.