Pagini recente » Cod sursa (job #2124388) | Cod sursa (job #770277) | Cod sursa (job #1448992) | Cod sursa (job #21648) | Cod sursa (job #2178892)
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;
stop:boolean;
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^.s:= d;
if c = nil then
c:=r
else
v^.urm:=r;
v:=r;
end;
procedure pop(var s:stiva);
var r:stiva;
begin
r:=s;
if s<>nil then
s:= s^.pre;
dispose(r);
end;
procedure popc;
var r:coada;
s:smax;
begin
r:=c;
if c<>nil then begin
if c^.inf = y then begin
write(g,abs(c^.s));
end;
c:= c^.urm;
end;
dispose(r);
end;
procedure BFS(nod:nmax);
begin
if (viz[nod] = 0) and not stop then begin
viz[nod]:=1;
while l[nod] <> nil do begin
if c<>nil then
if (l[nod]^.inf < nod) then
pushc(l[nod]^.inf,c^.s - l[nod]^.d)
else pushc(l[nod]^.inf,c^.s + l[nod]^.d);
pop(l[nod]);
end;
while c <> nil do begin
if c^.inf = y then stop:=true;
BFS(c^.inf);
popc;
end;
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;
stop:=false;
pushc(x,0);
BFS(x);
close(f);
close(g);
end.