Sunteți pe pagina 1din 2

Algoritmul lui Dijkstra determina cte un drum de cost minim de la vrful sursa x0,

la fiecare dintre celelalte vrfuri ale grafului.


Initial, singurul vrf pentru care drumul de cost minim este deja cunoscut este nu
mai vrful sursa x0.
La fiecare pas se va selecta un vrf, care nu a mai fost selectat si care se afla
la distanta minima de multimea vrfurilor selectate (cele pentru care drumul de co
st minim este deja determinat).
Distanta de la multimea vrfurilor deja selectate (sa o notam M) la un vrf oarecare
yeste egala cu costul drumului de cost minim de la vrful sursa x0 la y, drum car
e trece numai prin vrfuri din multimea M.
Dupa selectarea vrfului situat la distanta minima de M (fie acesta y), toate dist
antele de la M la vrfurile neselectate trebuie actualizate.
Mai exact, sa notam d[z] distanta de la vrful neselectat z la multimea M, nainte d
e selectarea vrfului y.
Prin includerea vrfului y n multimea M este posibil sa obtinem un drum de cost mai
mic, daca distanta d[z] este mai mare dect distanta pna la vrful y (d[y]) +costul
arcului (y, z), adica d[z]>d[y]+c[y][z]. n acest caz, distanta de la multimea M l
a vrful z trebuie actualizata.
Pentru a putea reconstitui si drumurile de cost minim, vom retine pentru fiecare
vrf ydin graf (exceptnd vrful x0) vrful care l preceda pe drumul de cost minim de la
x0la y.
n animatie, observati ca vrfurile incidente cu arcele rosii apartin multimii M (au
fost selectate) iar extremitatile finale ale arcelor verzi sunt vrfurile catre c
are s-a facut actualizarea si care sunt luate n calcul pentru selectare la urmato
rul pas.
pascal:
procedure dijkstra(var x0: integer)
var i, j, min, k, ok: integer;
var viz, d, tata: Array[1..NMAX] of integer;
begin
for i := 1 to n do begin
d[i] := C[x0][i];
tata[i] := x0;
viz[i] := 0;
end;
tata[x0] := 0;
viz[x0] := 1;
ok := 1;
while (ok=1) do begin
min := INFINIT;
for i := 1 to n do
if (viz[i]=0) and (min>d[i]) then begin
min := d[i];

k := i;
end;
if min <> INFINIT then begin
viz[k] := 1;
for i := 1 to n do
if(viz[i]=0) and (d[i]>d[k]+C[k][i])then begin
d[i] := d[k]+C[k][i];
tata[i] := k;
end;
end
else ok := 0;
end;
end;