Cod sursa(job #696760)

Utilizator amaliutzzaGoia Amalia amaliutzza Data 28 februarie 2012 19:57:18
Problema Algoritmul lui Dijkstra Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 2.55 kb
program asd;

type muchie=record nod, cost:longint; end;

var fi,fo:Text;
    a:Array of Array of muchie;
    cd,d,viz:array[1..1000000] of longint;
    n,m:longint;

    procedure citire_date;
    var i,x,y,z,poz:integer;
    begin
        readln(fi,n,m);
        setlength(a,n+1);

        for i:=1 to n do
          setlength(a[i],1);

        for i:=1 to m do
          begin
              readln(fi,x,y,z);

              //cresc lungimea vectorului care retine vecinii lui x
              setlength(a[x], length(a[x])+1);

              //actualizez "lungimea" listei de vecini a lui x
              //retinuta pe pozitia 0 a vectorului
              a[x,0].nod:=a[x,0].nod+1;

              poz:=a[x,0].nod; //pozitia unde voi pune urmatorul vecin al lui x

              a[x,poz].nod:=y;
              a[x,poz].cost:=z;

          end;
    end;

    procedure initializare_vector_lungimi;
    var i:integer;
    begin
        for i:=1 to n do
          d[i]:=maxint;
    end;

    procedure determinare;
    var ps,pi,nodstart,el,poz,i,nod,cost:integer;
    begin
        ps:=1; pi:=1; nodstart:=1;
        cd[ps]:=nodstart;
        d[nodstart]:=0;

        while ps<=pi do
          begin
              //la fiecare pas, se scoate un nod din coada (el) si se gasesc
              //toate nodurile i a caror distanta de la sursa la acestea
              //poate fi optimizat prin intermediul nodului el.
              //daca nodul w nu se afla deja in coada, el este adaugat.

              el:=cd[ps]; //scot din coada
              poz:=a[el,0].nod; //pana la ce pozitie sunt vecini ai lui el in mat

              for i:=1 to poz do
                begin
                    nod:=a[el,i].nod;
                    cost:=a[el,i].cost;
                    if d[nod]>d[el]+cost then
                      begin
                          d[nod]:=d[el]+cost;
                          viz[nod]:=1;
                          inc(pi);
                          cd[pi]:=nod;
                      end;
                end;

              inc(ps);

          end;
    end;

    procedure scriere;
    var i:integer;
    begin
        for i:=2 to n do
          begin
              if d[i]=maxint then
                d[i]:=0;
              write(fo,d[i],' ');
          end;
    end;

begin
    assign(fi,'dijkstra.in'); reset(fi);
    assign(fo,'dijkstra.out'); rewrite(fo);

        citire_date;

        initializare_vector_lungimi;

        determinare;

        scriere;

    close(Fi); close(Fo);
end.