Cod sursa(job #1373768)

Utilizator Stefan.Andras Stefan Stefan. Data 4 martie 2015 20:30:55
Problema Algoritmul Bellman-Ford Scor 65
Compilator fpc Status done
Runda Arhiva educationala Marime 1.76 kb
program bellman_ford;
var f,g:text;
    n,m,k,x,y,v,i,p,u,z,nod:longint;
    t:array[0..2,1..250001] of longint; //liste de adiacenta + cost
    start,d,coada,fr:array[1..250001] of longint;
    viz:array[1..250001] of byte; // = 1, daca nodul i se afla in coada !!
    ok:boolean;
begin
    assign(f,'bellmanford.in'); reset(f);
    assign(g,'bellmanford.out'); rewrite(g);
    readln(f,n,m); k:=0;
    //CITIRE
    for i:=1 to m do
       begin
          readln(f,x,y,v);
          inc(k);
          t[0,k]:=y;
          t[1,k]:=start[x];
          start[x]:=k;
          t[2,k]:=v;
       end;
    for i:=2 to n do
       d[i]:=maxlongint; //initializam distantele de la nodul sursa la celelalte noduri
    d[1]:=0;
    p:=1; u:=1;
    coada[1]:=1;
    ok:=true;
    while (p <= u) and (ok = true) do //cat timp am elemente in coada si nu am ciclu negativ
       begin
         nod:=coada[p]; viz[nod]:=0; z:=start[nod];
         while (z <> 0) and (ok = true) do
            begin
              if d[nod]+t[2,z] < d[t[0,z]] then
                 begin
                   d[t[0,z]] := d[nod]+t[2,z];
                   if viz[t[0,z]] = 0 then
                      begin
                        inc(u);
                        coada[u]:=t[0,z];
                        fr[t[0,z]]:=fr[t[0,z]]+1;
                        viz[t[0,z]]:=1;
                      end;
                 end;
              if fr[t[0,z]]  > n-1 then
                 ok:=false;
              z:=t[1,z];
            end;
         inc(p);
       end;
    //afisare
    if ok then
       begin
       for i:=2 to n do
          if d[i] < maxlongint then
             write(g,d[i],' ')
       end
       else
       write(g,'Ciclu negativ!');
   close(f); close(g);
end.