Cod sursa(job #1367555)

Utilizator mariusadamMarius Adam mariusadam Data 1 martie 2015 22:49:13
Problema Sate Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.47 kb
program sate_preoni_2006;
var     g:array[0..2,1..100024] of longint;
        start,cd,dist:array[1..30000] of longint;
        viz:array[1..30000] of 0..1;
        n,m,s,d,i:longint;
        fi,fo:text;

procedure citire;
var i,j,k,km,z:longint;
begin
 readln(fi,n,m,s,d);
 k:=0;
 for z:=1 to m do
 begin
        readln(fi,i,j,km);
        k:=k+1;
        g[0,k]:=j;
        g[1,k]:=start[i];
        g[2,k]:=km;
        start[i]:=k;
        k:=k+1;
        g[0,k]:=i;
        g[1,k]:=start[j];
        g[2,k]:=km;
        start[j]:=k;
 end;
end;

procedure bell_f(s:longint);
var st,sf,p,nod:longint;
begin
 for p:=1 to n do
        dist[p]:=maxlongint;
 st:=1; sf:=1;
 cd[st]:=s; dist[s]:=0;
 while st<=sf do
 begin
        nod:=cd[st];
        viz[nod]:=0;
        p:=start[nod];
        while p<>0 do
        begin
                if dist[nod]+g[2,p]<dist[g[0,p]] then
                begin
                        dist[g[0,p]]:=dist[nod]+g[2,p];
                        if viz[g[0,p]]=0 then
                        begin
                                sf:=sf+1;
                                cd[sf]:=g[0,p];
                                viz[g[0,p]]:=1;
                        end;
                end;
                p:=g[1,p];
        end;
        st:=st+1;
 end;
end;

begin
 assign(fi,'sate.in'); reset(fi);
 assign(fo,'sate.out'); rewrite(fo);
 citire;
 bell_f(s);
 writeln(fo,dist[d]);
 close(fi);
 close(fo);
end.