Cod sursa(job #697582)

Utilizator promix2012petruta andrei promix2012 Data 29 februarie 2012 09:57:39
Problema Algoritmul lui Dijkstra Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.53 kb
program mindsa;
const fi='dijkstra.in';
      fo='dijkstra.out';
type li=record
nod,val:longint;
end;
var v:array of array of li;
   c,s:array[1..50000] of longint;
  viz:array[1..50000] of longint;
  f,g:text;
  n,m,a,i,b,c1,min,pmin,j,min1,pmin1:longint;
  bufin,bufout:array[1..65000] of char;
begin
assign(f,fi);
reset(f);
settextbuf(f,bufin);
assign(g,fo);
rewrite(g);
settextbuf(g,bufout);
read(f,n,m);
setlength(v,n+1);
for i:=1 to m do
  begin
  read(f,a,b,c1);
  if b<>0 then
  begin
  inc(c[a]);
  setlength(v[a],c[a]+1);
  v[a,c[a]].nod:=b;
  v[a,c[a]].val:=c1;
  end;
  end;
for i:=1 to n do
s[i]:=maxlongint;
s[1]:=0;
for i:=1 to c[1] do
    s[v[1,i].nod]:=v[1,i].val;
   viz[1]:=1;
for j:=2 to n do
  begin
  if min<>min1 then
    begin
    min:=min1;
    pmin:=pmin1;
    end
    else
    begin
  min:=maxlongint;
  for i:=1 to n do
      if (viz[i]=0)and(s[i]<min) then
        begin
        min:=s[i];
        pmin:=i;
        end;
        end;
   viz[pmin]:=1;
   min1:=min;
  if min=maxlongint then break;
  for i:=1 to c[pmin] do
     if s[pmin]+v[pmin,i].val<s[v[pmin,i].nod] then
        begin
        s[v[pmin,i].nod]:=s[pmin]+v[pmin,i].val;
       if s[v[pmin,i].nod]<min1 then
          begin
          min1:=s[v[pmin,i].nod];
          pmin1:=v[pmin,i].nod;
          end;
     end;

  end;
  for i:=2 to n do
     begin
     if s[i]=maxlongint then
         write(g,0,' ')
         else

         write(g,s[i],' ');
         end;
close(f);
close(g);
end.