Cod sursa(job #2179129)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 19 martie 2018 22:56:53
Problema Sate Scor 60
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.53 kb
Program P1;
type smax = -20000000..20000000;
nmax = 0..30000;
coada = ^ccelula;
ccelula = record
        inf:nmax;
        s:smax;
        urm:coada;
        end;
stiva = ^celula;
celula = record
        inf:nmax;
        d:smax;
        pre:stiva;
        end;
lista = array[nmax] of stiva;
vi = array[nmax] of 0..1;
var n1,n2,n,x,y:nmax;
m,i:longint;
d:smax;
f,g:text;
l:lista;
viz:vi;
c,v:coada;
procedure Push(nod:nmax; d:longint; var s:stiva);
var r:stiva;
begin
 new(r);
 r^.inf:=nod;
 r^.d:=d;
 r^.pre:=s;
 s:=r;
end;
procedure Pushc(nod:nmax; d:longint);
var r:coada;
begin
 new(r);
 r^.inf:=nod;
 r^.urm:=nil;
 r^.s:= d;
 if c = nil then
  c:=r
 else
  v^.urm:=r;
 v:=r;
end;
procedure pop(var s:stiva);
var r:stiva;
begin
if s<>nil then begin
  r:=s;
  s:= s^.pre;
  dispose(r);
 end;
end;
procedure popc;
var r:coada;
begin
if (c <> nil) then begin
 r:=c;
 if c^.inf = y then
   write(g,abs(c^.s));
 c:= c^.urm;
 dispose(r);
 end;
end;
procedure BFS(nod:nmax);
begin
pushc(nod,0);
viz[nod] := 1;
 while c <> nil do begin
  while l[nod] <> nil do begin
   if viz[l[nod]^.inf] = 0 then begin
    pushc(l[nod]^.inf,c^.s + l[nod]^.d);
    viz[l[nod]^.inf]:=1;
    end;
    pop(l[nod]);
  end;
  popc;
  if c<>nil then
  nod:=c^.inf;
 end;
end;
begin
assign(f,'sate.in');
assign(g,'sate.out');
reset(f);
rewrite(g);
new(v);
readln(f,n,m,x,y);
for i:=1 to m do begin
 readln(f,n1,n2,d);
 push(n1,-d,l[n2]);
 push(n2,d,l[n1]);
end;
BFS(x);
close(f);
close(g);
end.