Cod sursa(job #156093)

Utilizator hitmannCiocas Radu hitmann Data 12 martie 2008 12:44:29
Problema Algoritmul lui Dijkstra Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.4 kb
program distante;
const
pinfinit=1.e20;
type pnod=^nod;
     nod=record
         nod:longint;
         i:longint;
         urm:pnod;
         end;
var a:array[1..50000]of pnod;
    d:array[1..50000]of real;
    s:array[1..50000]of longint;
    i,poz,r,n,m,j:longint;
    p:pnod;
    ok:boolean;
    min:real;
    f,g:text;
procedure citire;
var z,y,x:longint;
begin
read(f,n,m);
for i:=1 to n do begin d[i]:=pinfinit; end;
for i:=1 to m do begin
 read(f,x,y,z); new(p);
 p^.nod:=y; p^.i:=z; p^.urm:=a[x]; a[x]:=p;
  end;
end;
begin {pp}
assign(f,'dijkstra.in'); reset(f); assign(g,'dijkstra.out'); rewrite(g);
citire;
r:=1;
s[r]:=1;
p:=a[r];
while p<>nil do
 begin
 d[p^.nod]:=p^.i; writeln('=',p^.i);
 p:=p^.urm;
 end;
d[r]:=0;
for i:=1 to n-1 do
begin

ok:=true;
min:=pinfinit;
poz:=0;
for j:=1 to n do if (min>d[j])and(s[j]=0)then begin
                                   min:=d[j];
                                   poz:=j;
                                   end;
if poz=0 then break;
s[poz]:=1;
p:=a[poz];
while p<>nil do
   begin
if s[p^.nod]=0 then if d[p^.nod]>d[poz]+p^.i then
             begin
           d[p^.nod]:=d[poz]+p^.i;
             end;

   p:=p^.urm;
    end;
end;
ok:=true;
i:=1;
for i:=2 to n do  if d[i]<>pinfinit then write(g,d[i]:0:0,' ')
                                   else write(g,0,' ');
close(g); close(f);
end.