Pagini recente » Cod sursa (job #1155055) | Cod sursa (job #3125768) | Cod sursa (job #33742) | Cod sursa (job #2829131) | Cod sursa (job #41674)
Cod sursa(job #41674)
//infoarena pscnv
const max = 250000;
type plist = ^tlist;
tlist = record
x:longint;
k:integer;
next:plist;
end;
rr= record
head,last:plist;
end;
var v:array[0..max] of rr;
viz:array[1..max] of boolean;
n,m,x,y:longint;
kmin,kmax:integer;
procedure add(nod,x,k:longint);
var p:plist;
begin
new(p); p^.x:=x; p^.k:=k; p^.next:=nil;
if v[nod].head= nil then
v[nod].head:=p
else v[nod].last^.next:=p;
v[nod].last:=p;
end;
function getmin(nod:longint):longint;
var p:plist;
begin
p:=v[nod].head;
getmin:=p^.x;
v[nod].head:=v[nod].head^.next;
dispose(p);
end;
function bfs(k:integer):boolean;
var p:plist;
nod:longint;
begin
add(0,x,0);
viz[x]:=true;
bfs:=false;
fillchar(viz,sizeof(viz),false);
while v[0].head <> nil do
begin
nod:=getmin(0);
p:=v[nod].head;
if nod = y then
begin
bfs:=true;
exit;
end;
while p <> nil do
begin
if p^.k <= k then
begin
add(0,p^.x,p^.k);
viz[p^.x]:=true;
end;
p:=p^.next;
end;
end;
end;
function bsearch(a,b:integer):integer;
var c:integer;
begin
c:=(a+b) div 2;
if b <a then exit;
if bfs(c) then
begin
kmin:=c;
bsearch(a,c-1);
end
else
bsearch(c+1,b);
end;
procedure citire;
var i,a,b,c:longint;
f:text;
buf:array[1..65536] of byte;
begin
assign(f,'pscnv.in');reset(f); settextbuf(f,buf);
readln(f,n,m,x,y);
for i:=1 to m do
begin
readln(f,a,b,c);
if c > kmax then kmax:=c;
add(a,b,c);
end;
close(f);
end;
begin
citire;
bsearch(1,kmax);
assign(output,'pscnv.out'); rewrite(output);
writeln(kmin);
close(output);
end.