Cod sursa(job #152297)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 9 martie 2008 12:28:23
Problema Algoritmul lui Dijkstra Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.73 kb
program djkstra;
const Inf=999999;
var c:array[1..100,1..100]of Longint;
    d:array[1..100]of Longint;
    viz:array[1..100]of boolean;
    t:array[1..100] of Longint;
    n,m,i0:longint;
    f:text;
procedure Citeste;
var i,j,k,l:Longint;
begin
assign(f,'dijkstra.in');reset(f);
readln(f,n,m);{readln(f,i0);}
i0:=1;
for i:=1 to n do
 for j:=1 to n do c[i,j]:=Inf;
for i:=1 to n do c[i,i]:=0;
for i:=1 to m do begin
                 readln(f,j,k,l);
                 c[j,k]:=l;
                 c[k,j]:=l;
                 end;
close(f);
end;
procedure Drum(vf:integer);
begin
if vf=i0 then write(i0,' ')
         else begin
              Drum(t[vf]);
              write(vf,' ');
              end;
end;
procedure Dijkstra;
var i,j,k,min:Longint;
begin
for i:=1 to n do begin
                 viz[i]:=false;
                 d[i]:=c[i0,i];
                 if d[i]<Inf then t[i]:=i0
                              else t[i]:=0;
                 end;
viz[i0]:=true;d[i0]:=0;t[i0]:=0;
for i:=1 to n-1 do
  begin
  min:=Inf;
  for j:=1 to n do if (not viz[j])and(d[j]<min) then
                  begin
                  min:=d[j];
                  k:=j;
                  end;
  viz[k]:=true;
  for j:=1 to n do
   if (not viz[j])and(d[j]>d[k]+c[k,j]) then
     begin
     t[j]:=k;
     d[j]:=d[k]+c[k,j];
     end;
  end;
end;
procedure scrie;
var i:Longint;
begin
assign(f,'dijkstra.out');rewrite(f);
{for i:=1 to n do begin
                 writeln('Costul minim al unui drum de la ',i0, 'la ',i,' este ',d[i]);
                 writeln('Drumul este: ');
                 drum(i);
                 end;  }
for i:=2 to n do write(f,d[i],' ');
close(f);
end;
begin
Citeste;
Dijkstra;
Scrie;
end.