Você está na página 1de 4

EL ALGORITMO DE DIJKSTRA

Sea un grafo ponderado g = (V,A), donde V es su conjunto de vrtices, A el conjunto de arcos y sea L[i,j] su matriz de adyacencia. Queremos calcular el camino ms corto entre un vrtice vi tomado como origen y cada vrtice restante vj del grafo. El clsico algoritmo de Dijkstra trabaja en etapas, en donde en cada una de ellas va aadiendo un vrtice al conjunto D que representa aquellos vrtices para los que se conoce su distancia al vrtice origen. Inicialmente el conjunto D contiene slo al vrtice origen. Es posible plantear el algoritmo de Dijkstra en trminos de la Programacin Dinmica, y de esta forma aprovechar el mtodo de diseo y las ventajas que esta tcnica ofrece. En primer lugar, observemos que es posible aplicar el principio de ptimo en este caso: si en el camino mnimo de vi a vj est un vrtice vk como intermedio, los caminos parciales de vi a vk y de vk a vj han de ser a su vez mnimos. Llamaremos D(j) al vector que contiene el camino mnimo desde el vrtice origen i = 1 a cada vrtice vj, 2 <=j <n, siendo n el nmero de= si no existe elvrtices. Inicialmente D contiene los arcos L(1,j), o bien arco. A continuacin, y para cada vrtice vk del grafo con k <>1, se repetir:

De esta forma el algoritmo que resuelve el problema puede ser implementado como CONST TYPE n = ...; = = (* numero ARRAY ARRAY Dijkstra(VAR de vertices del OF OF grafo sigue: *)

MATRIZ

[1..n],[1..n] [2..n]

CARDINAL; CARDINAL; D:SOLUCION); S:MARCA;

MARCA = ARRAY [1..n] OF BOOLEAN;(* elementos ya considerados*) SOLUCION PROCEDURE VAR BEGIN FOR i:=2 TO n DO

L:MATRIZ;VAR

i,j,menor,pos,s:CARDINAL;

S[i]:=FALSE; D[i]:=L[1,i] END; S[1]:=TRUE; FOR S[pos]:=TRUE; FOR IF D[j]:= END; END; END END Dijkstra; j:=2 TO NOT(S[j]) n DO THEN Min2(D[j],D[pos]+L[pos,j]) i:=2 TO n-1 DO menor:=Menor(D,S,pos);

La funcin Menor es la que calcula el mnimo de la expresin en recurrencia que define la solucin del problema:

PROCEDURE Menor(VAR D:SOLUCION; VAR S:MARCA; VAR pos:CARDINAL) :CARDINAL; VAR BEGIN menor:=MAX(CARDINAL); FOR IF IF menor:=D[i]; END END END; RETURN END menor Menor; i:=2 TO NOT(S[i]) n pos:=1; DO THEN D[i] pos:=i menor,i:CARDINAL;

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 tcnica frente al planteamiento vido del algoritmo, pero sin embargo s ganamos en sencillez del diseo e implementacin de la solucin a partir del planteamiento del problema.

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 funcin Menor es la que calcula el mnimo de la expresin en recurrencia que define la solucin 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;

Você também pode gostar