Cod sursa(job #41674)

Utilizator andrei_infoMirestean Andrei andrei_info Data 28 martie 2007 14:26:22
Problema PScNv Scor 80
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.1 kb
//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.