Cod sursa(job #1368737)

Utilizator casianos1996Marc Casian Nicolae casianos1996 Data 2 martie 2015 19:43:44
Problema Algoritmul lui Dijkstra Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.42 kb
program dijkstra;
var     st,sf,p,nod,x,y,c,i,j,k,n,m:longint;
        t:array[0..2,1..500000] of longint;
        viz,start,nr,d:array[1..50000] of longint;
        cd:array[1..500000] of longint;
        bufin,bufout:array[1..66000] of byte;
        ok:boolean;

begin
  assign(input,'dijkstra.in'); reset(input);
  assign(output,'dijkstra.out'); rewrite(output);
  settextbuf(input,bufin);
  settextbuf(output,bufout);
  readln(n,m); k:=0;
  for i:=1 to m do
    begin
      readln(x,y,c);
      inc(k);
      t[0,k]:=y;
      t[1,k]:=start[x];
      start[x]:=k;
      t[2,k]:=c;
    end;
  for i:=2 to n do
    d[i]:=maxlongint;
  st:=0; sf:=1; cd[1]:=1; d[1]:=0; ok:=true;
  while st<sf do
    begin
      inc(st);  nod:=cd[st]; p:=start[nod]; viz[nod]:=0;
      while (p<>0) and (ok=true) do
        begin
          if d[nod]+t[2,p]<d[t[0,p]] then
            begin
              d[t[0,p]]:=d[nod]+t[2,p];
              if viz[t[0,p]]=0 then
                begin
                  inc(sf);
                  cd[sf]:=t[0,p];
                  viz[t[0,p]]:=1;
                  nr[t[0,p]]:=nr[t[0,p]]+1;
                end;
            end;
          if nr[t[0,p]]>n-1 then ok:=false;
          p:=t[1,p];
        end;
    end;
  //if ok then
    begin
      for i:=2 to n do
        if d[i]<maxlongint then write(d[i],' ')
        else write(0,' ');
    end;
  close(input); close(output);
end.