Cod sursa(job #274026)

Utilizator weaselwizVarvescu Ciprian weaselwiz Data 9 martie 2009 12:42:35
Problema Algoritmul lui Dijkstra Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.08 kb
{Dijkstra - drumurile de costuri min de la varful initial xp la fiecare i}
{grafuri orientate}
const nmax=170;
      inf=maxint div 2;
var f,gg:text;
    c:array[1..nmax,1..nmax]of integer;
    s:array[1..nmax]of 0..1;
    m:longint;
    n,i,j,x,y,xp,k:word;
    z:0..1000;
    arc:0..250000;
    d:array[1..nmax]of integer;
    g:boolean;

procedure min(var k:word);
var m,i:integer;
begin
m:=inf*2;
for i:=1 to n do
    if (s[i]=0) and (d[i]<m) then
       begin
       m:=d[i];
       k:=i;
       end
end;

{procedure drum(i:integer);
begin
if i<>0 then begin
             drum(prec[i]);
             write(gg,i,' ');
             end
        else writeln
end;}

begin
assign(f,'c.in');reset(f);
assign(gg,'c.out');rewrite(gg);
readln(f,n,arc);
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 arc do
    begin
    readln(f,x,y,z);
    c[x,y]:=z;
    end;
readln(f,xp);
for i:=1 to n do begin
                 d[i]:=c[xp,i];
                 s[i]:=0;
                 {if c[xp,i]<inf then prec[i]:=xp
                                else prec[i]:=0;}
                 end;
s[xp]:=1;
{prec[xp]:=0;}
g:=true;
x:=0;
repeat
      min(k);
      x:=x+1;
      if (d[k]=inf) or (x=n) then g:=false
                             else
         begin
         s[k]:=1;
         for j:=1 to n do
             if (s[j]=0) and (d[j]>d[k]+c[k,j]) then begin
                                                     d[j]:=d[k]+c[k,j];
                                                     {prec[j]:=k;}
                                                     end;
         end;
until not g;
for i:=1 to n do
    if i<>xp then
       if d[i]=inf then begin
                        write(gg,0{'Nu exista drum de la ',xp,' la ',i});
                        {writeln(g);}
                        end
                   else begin
                        write(gg,d[i],' '{'Drum minim de la ',xp,' la ',i});
                        {drum(i);
                        writeln(gg);}
                        end;
close(gg);
end.