You are on page 1of 14

Algoritmo de Dijkstra

ALT F4 Y LES BLEUS


DEFINICION
El algoritmo de Dijkstra, también llamado algoritmo de
caminos mínimos, es un algoritmo para la determinación del
camino más corto, dado un vértice origen, hacia el resto de los
vértices en un grafo que tiene pesos en cada arista. Su
nombre alude a Edsger Dijkstra, científico de la computación
de los Países Bajos que lo describió por primera vez en 1959.
La idea subyacente en este algoritmo consiste en ir explorando todos
los caminos más cortos que parten del vértice origen y que llevan a
todos los demás vértices; cuando se obtiene el camino más corto
desde el vértice origen hasta el resto de los vértices que componen el
grafo, el algoritmo se detiene.

Se trata de una especialización de la búsqueda de costo uniforme y,


como tal, no funciona en grafos con aristas de coste negativo (al
elegir siempre el nodo con distancia menor, pueden quedar
excluidos de la búsqueda nodos que en próximas iteraciones
bajarían el costo general del camino al pasar por una arista con
costo negativo).
ALGORITMO
Teniendo un grafo dirigido ponderado de N nodos
no aislados, sea x el nodo inicial. Un vector D de
tamaño N guardará al final del algoritmo las
distancias desde x hasta el resto de los nodos. Por
lo tanto, los pasos a seguir son:

---------
1. Inicializar todas las distancias en D con un valor infinito relativo, ya que son desconocidas
al principio, exceptuando la de x, que se debe colocar en 0, debido a que la distancia de x
a x sería 0.
2. Sea a = x (Se toma a como nodo actual).
3. Se recorren todos los nodos adyacentes de a, excepto los nodos marcados. Se les llamará
nodos no marcados v.
4. Para el nodo actual, se calcula la distancia tentativa desde dicho nodo hasta sus vecinos
con la siguiente fórmula: dt(v) = Da + d(a,v). Es decir, la distancia tentativa del nodo ‘v’ es la
distancia que actualmente tiene el nodo en el vector D más la distancia desde dicho nodo
‘a’ (el actual) hasta el nodo vi. Si la distancia tentativa es menor que la distancia
almacenada en el vector, se actualiza entonces el vector con esta distancia tentativa. Es
decir, si dt(v) < Dv → Dv = dt(v).
5. Se marca como completo el nodo a.
6. Se toma como próximo nodo actual el de menor valor en D (puede hacerse almacenando
los valores en una cola de prioridad) y se regresa al paso 3, mientras existan nodos no
marcados.
peso
G=(V,E)

Cada arista e=(a,b) tiene un numero real positivo llamado peso,


denotado p(e) o p(a,b)

Si x e y pertenecen a V pero (x,y) no pertenece a E entonces


p(x,y)=infinito

p(e) puede representar: A)longitud carretera de a a b B) tiempo para


recorrer carretera de a a b C) costo de viaje de a a b por esa
carretera

Puede suceder que p(x,y) sea distinto a p(y,x) para ciertas aristas
(x,y) y (y,x).Puede darse el caso que p(x,y) sea infinito pero p(y,x)
un numero finito.
distancia
Si interpretamos p(e) como Supongamos S es un
la longitud de una ruta subconjunto de V con u0
directa de a a b podemos perteneciente a S y S’=V-S.
escribir d(a,b) como la
Si P=u0....u’v’ es el
distancia mas corta.Si no
camino mas corto de u0 a S’
existe el camino entonces
entonces u’ debe claramente
d(a,b) sera infinito.
pertenecer a S y la seccion
(u0,u’) de P debe ser el
camino mas corto del camino
(u0,u’)

d(u0,v’)=d(u0,u’)+p(u’,v’)
Se utiliza tambien el label(etiqueta) ,
La formula denotado l(v). Este es el limite superior de
d(u0,v).
Inicialmente l(u0)=0 y l(v)=infinito, con v
La distancia de u0 a distinto a u0.
Esta etiqueta indica la mejor estimación
S’ esta dada por la
actual de la longitud de la ruta más corta
formula:
de u a v.
A medida que el algoritmo procede el label
d(u0,S’)=min{d(u0,u)
se va modificando cuando los vertices
+p(u,v)}
empiezan a ser adyacentes a la franja que
se esta formando.
Con u perteneciente
La formula para calcular el label queda
a S y v
como
perteneciente a S’ l(v)=min(l(v)+(l(u)+p(u,v))) con u perteneciente
a la franja
Codigo
Complejidad
A arcos y N nodos

O(AxT(actualizar_distancia) + NxT(encontrar_minimo))

= O(A+N²)=O(N²)

Si A<<N²:

Con ABB: Θ((A+N)logN))

Con Monticula de Fibonacci: Θ(A+NlogN)


Prueba de Corrección
“Después de haber visitado N nodos, valen :

(1): Si el nodo v fue visitado, dist(v)=opt(v)

(2): Si el nodo w no fue visitado, dist(w)=opt_N(w)”

-dist(v) es la distancia temporal encontrada para v

-opt(v) es la distancia optimal entre v y el origen

-opt_N(v) es la distancia optimal solo usando nodos


visitados
Ej : Calcular el camino de menor longitud entre a y p
11 7
C G L
3 9 1 8 5
4 8 6
B F K
8 12
6 7
4 5
A E J P
9
5 9 8 10 12
D I N
2 6
6 2
H M
7
Matricia Final

Vertice A B C D E F G

Final (0,A) (8,A) (11,B) (5,A) (4,A) (7,E) (8,F)

Vertice H I J K L M N P

Final (11,D) (12,E) (9,E) (15,F) (15,G) (18,I) (18,J) (21,L)

(21, L) -> (15,G) -> (8,F) -> (7,E) -> (4,A)

A -> E -> F -> G -> L -> P con un peso de 21


11 7
C G L
3 9 1 8 5
4 8 6
B F K
8 12
6 7
4 5
A E J P
9
5 9 8 10 12
D I N
2 6
6 2
H M
7

You might also like