Pagini recente » Cod sursa (job #1590818) | Cod sursa (job #342394) | Cod sursa (job #1107748) | Cod sursa (job #1933947) | Cod sursa (job #186593)
Cod sursa(job #186593)
const inf = 1001;
type pelem = ^elem;
elem = record
info, cost : integer;
next : pelem;
end;
var fi, fo : text;
n, m, ns, nf, i, j, k, c, min : integer;
v : array[1..250000]of pelem;
d, H, poz : array[1..250000]of integer;
p : pelem;
procedure down(i,n:integer);
var fiu,tata,v:integer;
begin
tata:=i; fiu:=i shl 1; v:=H[i];
while fiu<=n do
begin
if fiu<n then
if d[H[fiu]]>d[H[fiu+1]] then inc(fiu);
if d[v]>d[H[fiu]] then
begin
H[tata]:=H[fiu];
poz[H[fiu]]:=tata;
tata:=fiu;
fiu:=fiu shl 1;
end
else fiu:=n+1;
end;
H[tata]:=v;
poz[v]:=tata;
end;
procedure up(i,n:integer);
var tata,fiu,aux:integer;
begin
fiu:=i; tata:=fiu shr 1;
while (tata<>0)and(d[H[tata]]>D[H[fiu]]) do
begin
aux:=H[fiu];
H[fiu]:=H[tata];
poz[H[tata]]:=fiu;
H[tata]:=aux;
poz[aux]:=tata;
fiu:=tata;
tata:=fiu shr 1;
end;
end;
begin
assign(fi,'pscnv.in'); reset(fi);
assign(fo,'pscnv.out'); rewrite(fo);
read(fi,n,m,ns,nf);
for i:=1 to m do
begin
read(fi,j,k,c);
new(p);
p^.info:=k;
p^.cost:=c;
p^.next:=v[j];
v[j]:=p;
end;
for i:=1 to n do
begin
d[i]:=inf;
H[i]:=i;
poz[i]:=1;
end;
p:=v[ns];
while p<>nil do
begin
d[p^.info]:=p^.cost;
p:=p^.next;
end;
d[ns]:=inf+1;
for i:=n shr 1 downto 1 do
down(i,n);
while n>2 do
begin
min:=H[1];
H[1]:=H[n];
dec(n);
down(1,n);
p:=v[min];
while p<>nil do
begin
if d[min]>p^.cost then
if d[p^.info]>d[min] then
begin
d[p^.info]:=d[min];
up(poz[p^.info],n);
end;
if d[min]<=p^.cost then
if d[p^.info]>p^.cost then
begin
d[p^.info]:=p^.cost;
up(poz[p^.info],n);
end;
p:=p^.next;
end;
end;
writeln(fo,d[nf]);
close(fi);
close(fo);
end.