Cod sursa(job #1077119)

Utilizator mariusadamMarius Adam mariusadam Data 10 ianuarie 2014 21:58:17
Problema Algoritmul lui Dijkstra Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.27 kb
program dijkstra_infoarena;
var viz:array[1..50000] of 0..1;
    d:array[1..250000] of longint;
    tata:array[1..50000] of longint;
    c:array[1..10000,1..10000] of integer;
    n,i,m:longint;
    f,g:text;

procedure citire_cost;
var i,j,k:integer;
begin
 assign(f,'dijkstra.in'); reset(f);
 readln(f,n,m);
 for i:=1 to n do
  for j:=1 to n do
   if i=j then
    c[i,j]:=0
   else
    c[i,j]:=maxint;
  for k:=1 to m do
  readln(f,i,j,c[i,j]);
 close(f);
end;

procedure dijkstra(x0:integer);
var i,j,min,k,ok:integer;
begin
 for i:=1 to n do
  begin
   d[i]:=c[x0,i];
   viz[i]:=0;
   tata[i]:=x0;
  end;
 viz[x0]:=1;
 tata[x0]:=1;
 ok:=1;
 while ok=1 do
  begin
   min:=maxint;
   for i:=1 to n do
    if (viz[i]=0) and (min>d[i]) then
     begin
      min:=d[i];
      k:=i;
     end;
   if min<>maxint then
    begin
     viz[k]:=1;
     for i:=1 to n do
      if (viz[i]=0) and (d[i]>d[k]+c[k,i]) then
       begin
        d[i]:=d[k]+c[k,i];
        tata[i]:=k;
       end;
    end
   else
    ok:=0;
  end;
end;

begin
 citire_cost;
 assign(g,'dijkstra.out'); rewrite(g);
 dijkstra(1);
 for i:=2 to n do
  if (tata[i]<>0) then
   if d[i]=maxint then
    write(g,0,' ')
   else
     write(g,d[i],' ');
 close(g);
end.