Cod sursa(job #1373816)

Utilizator trifa_mariaTrifa Maria trifa_maria Data 4 martie 2015 20:43:39
Problema Algoritmul Bellman-Ford Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.86 kb
program bellman;
var t:array[0..2,1..500001] of longint;
    start,viz,fr,d:array[0..50000] of longint;
    cd:array[1..500001] of longint;
    ok:boolean;
    nod,st,sf,x,y,v,i,j,n,m,k,p:longint;
    bufin,bufout:array[1..750002] of byte;
    f,g:text;
begin
    assign(f,'bellmanford.in');
    reset(f);
    assign(g,'bellmanford.out');
    rewrite(g);
    settextbuf(f,bufin);
    settextbuf(g,bufout);
    readln(f,n,m);
    k:=0;
    for i:=1 to m do
       begin
           read(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;
    d[1]:=0;
    st:=0;
    sf:=1;
    cd[1]:=1;
    ok:=true;
    while (st<=sf) and (ok=true) do
        begin
             inc(st);
             nod:=cd[st];
             viz[nod]:=0;
             p:=start[nod];
             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];
                                  inc(fr[t[0,p]]);
                                  viz[t[0,p]]:=1;
                               end;
                        end;
                    if fr[t[0,p]]>=n then
                        ok:=false;
                    p:=t[1,p];
                end;
        end;
    if ok=true then
      begin
        for i:=2 to n do
            if d[i]<maxlongint then
                write(g,d[i],' ')
            else
                writeln(g,0,' ');
      end
    else
       write(g,'Ciclu negativ!');
    close(f);
    close(g);
end.