Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/doomburger | Monitorul de evaluare | Istoria paginii utilizator/carmin_andra | Cod sursa (job #1036784)
Program satele_distanta;
uses crt;
type drum=record
x,y:integer; d:longint;
end;
rezul=record
p:integer; k:longint;
end;
var
a:array[1..100024] of drum;
parcurs:array[1..100024] of boolean;
rez:array[1..30001] of rezul;
val:array[1..30001] of longint;
i,n,m,xi,xf,l,r:integer; f,g:text;
Procedure control(l:integer);
begin
for i:=1 to m do
if parcurs[i] then
begin
if a[i].x=rez[l].p then
begin parcurs[i]:=false;
if val[a[i].y]=0 then begin
rez[r].p:=a[i].y;
if a[i].y<rez[l].p then rez[r].k:=rez[l].k+a[i].d else rez[r].k:=rez[l].k-a[i].d;
val[a[i].y]:=rez[r].k;
inc(r); end;
end;
if a[i].y=rez[l].p then
begin parcurs[i]:=false;
if val[a[i].x]=0 then begin
rez[r].p:=a[i].x;
if a[i].x<rez[l].p then rez[r].k:=rez[l].k+a[i].d else rez[r].k:=rez[l].k-a[i].d;
val[a[i].x]:=rez[r].k;
inc(r); end;
end;
end;
end;
begin
clrscr;
assign(f,'sate.in'); reset(f);
read(f,n,m,xi,xf);
for i:=1 to m do
begin
read(f,a[i].x,a[i].y,a[i].d);
parcurs[i]:=true;
end;
close(f);
for i:=1 to n do
val[i]:=0;
l:=1; r:=2;
rez[l].p:=xi; rez[l].k:=0; val[xi]:=0;
while val[xf]=0 do
begin
control(l);
inc(l);
end;
assign(g,'sate.out');
rewrite(g);
writeln(g,abs(val[xf]));
close(g);
readkey;
end.