El clásico algoritmo de Dijkstra trabaja en etapas, en donde en cada una de ellas va añadiendo un vértice al conjunto D que representa aquellos vértices para los que se conoce su distancia al vértice origen. Inicialmente el conjunto D contiene sólo al vértice origen.
Es posible plantear el algoritmo de Dijkstra en términos de la Programación Dinámica, y de esta forma aprovechar el método de diseño y las ventajas que esta técnica ofrece.
En primer lugar, observemos que es posible aplicar el principio de óptimo en este caso: si en el camino mínimo de vi a vj está un vértice vk como intermedio, los caminos parciales de vi a vk y de vk a vj han de ser a su vez mínimos.
Llamaremos D(j) al vector que contiene el camino mínimo desde el vértice origen i = 1 a cada vértice vj, 2 <=j <=n, siendo n el número de vértices. Inicialmente D contiene los arcos L(1,j), o bien ∞ si no existe el arco. A continuación, y para cada vértice vk del grafo con k <>1, se repetirá:

De esta forma el algoritmo que resuelve el problema puede ser implementado
como sigue:
CONST n = ...; (* numero de vertices del grafo *)
TYPE MATRIZ = ARRAY [1..n],[1..n] OF CARDINAL;
MARCA = ARRAY [1..n] OF BOOLEAN;(* elementos ya considerados*)
SOLUCION = ARRAY [2..n] OF CARDINAL;
PROCEDURE Dijkstra(VAR L:MATRIZ;VAR D:SOLUCION);
VAR i,j,menor,pos,s:CARDINAL; S:MARCA;
BEGIN
FOR i:=2 TO n DO
S[i]:=FALSE;
D[i]:=L[1,i]
END;
S[1]:=TRUE;
FOR i:=2 TO n-1 DO
menor:=Menor(D,S,pos);
S[pos]:=TRUE;
FOR j:=2 TO n DO
IF NOT(S[j]) THEN
D[j]:= Min2(D[j],D[pos]+L[pos,j])
END;
END;
END
END Dijkstra;
La función Menor es la que calcula el mínimo de la expresión en recurrencia
que define la solución del problema:
PROCEDURE Menor(VAR D:SOLUCION; VAR S:MARCA; VAR pos:CARDINAL)
:CARDINAL;
VAR menor,i:CARDINAL;
BEGIN
menor:=MAX(CARDINAL); pos:=1;
FOR i:=2 TO n DO
IF NOT(S[i]) THEN
IF D[i]
menor:=D[i]; pos:=i
END
END
END;
RETURN menor
END Menor;
La complejidad temporal del algoritmo es de orden O(n2), siendo de orden O(n) su complejidad espacial. No ganamos sustancialmente en eficiencia mediante el uso de esta técnica frente al planteamiento ávido del algoritmo, pero sin embargo sí ganamos en sencillez del diseño e implementación de la solución a partir del planteamiento del problema.





De igual forma, podemos analizar el coste mediante una formulación hacia adelante:

