Cod sursa(job #287996)

Utilizator punkistBarbulescu Dan punkist Data 25 martie 2009 14:05:42
Problema BFS - Parcurgere in latime Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.65 kb
type Lista=^Element;
     Element=record
              nr:longint;
              leg:Lista;
             end;

var n,m,s:longint;
    vecini:array[1..100000] of record
                                first,last:Lista;
                               end;
    dist:array[1..100000] of longint;
procedure Citeste;
var f:text;
    i:longint;
    l,test:Lista;
    a,b:longint;
 begin
  assign(f,'bfs.in');
  reset(f);
  readln(f,n,m,s);
  for i:=1 to n do
   begin
    New(l);
    l^.nr:=0;
    l^.leg:=nil;
    vecini[i].first:=l;
    vecini[i].last:=l;
    dist[i]:=-1;
   end;
  for i:=1 to m do
   begin
    readln(f,a,b);
    New(l);
    l^.nr:=b;
    l^.leg:=nil;
    vecini[a].last^.leg:=l;
    vecini[a].last:=l;
   end;
  close(f);
 end;

procedure Parcurge;
 var i,j,nod,vecin,inC,sfC:longint;
     C:array[1..100005] of longint;
     viz:array[1..100005] of boolean;
     d:array[1..100005] of longint;
     l:Lista;
 begin
  for i:=1 to n do viz[i]:=false;
  inC:=1;sfC:=1;
  c[1]:=s;d[1]:=0;
  while inC<=sfC do
   begin
    nod:=C[inC];
    viz[nod]:=true;
    dist[nod]:=d[inC];
    inC:=inC+1;
    l:=vecini[nod].first;
    repeat
     begin
      vecin:=l^.nr;
      if vecin<>0 then
        if not viz[vecin] then
         begin
          viz[vecin]:=true;
          sfC:=sfC+1;
          C[sfC]:=vecin;
          d[sfC]:=d[inC-1]+1;
         end;
      l:=l^.leg;
     end;
    until l=nil;
  end;
 end;

procedure Scrie;
var f:text;
    i:longint;
begin
 assign(f,'bfs.out');
 rewrite(f);
 for i:=1 to n do write(f,dist[i],' ');
 close(f);
end;

begin
Citeste;
Parcurge;
Scrie;
end.