Sei sulla pagina 1di 107

Problema de los caminos

mínimos con pesos positivos:


Algoritmo Dijkstra
Dra. Laura Cruz Reyes
Instituto Tecnológico de Ciudad Madero
México
Problema de los Caminos Mínimos con
Coste Positivo y Origen Único
„ Encontrar el caminos más corto desde el vértice
origen O al resto de los vértices, medido por la
suma del costo de las aristas del camino. El
costo de cada arista es no negativo.

„ Queremos calcular los caminos mínimos con


pesos positivos desde un vértice origen al resto
de los vértices. El método clásico de solución es
el algoritmo de Dijkstra.

Laura Cruz Reyes Grafos y Caminos


Fundamento

Las siguientes cuestiones deben ser


examinadas:

¾ ¿Cómo se ajusta el costo de ir del nodo


origen a otro nodo?

¾ ¿Cómo se busca el siguiente vértice v en el


cual centrar la atención?

Laura Cruz Reyes Grafos y Caminos


Fundamento
„ Sea v el vértice actual
Dw con un camino Dv, y
Dv sea w el vértice
c adyacente a V con un
Vértice 
actual
v w camino Dw.
Vertice
adyacente „ Actualizando Dw una
sola vez no podemos
0 garantizar que se
O obtenga el mínimo.

Laura Cruz Reyes Grafos y Caminos


Fundamento
Si Dw > (Dv+Cv,w)
„ Si Dw es el costo sin
Dv Dw utilizar v, y ahora se está
c evaluando el costo de ir a
w pasando por v, entonces
Vértice 
actual
v w Dw debería modificarse si
su valor actual es mayor
que Dv + Cv,w.
Vertice
adyacente „ Entonces Dv+Cv,w es el
0 costo del camino más
O barato, pasando por los
vértices que llegan a v,
considerados hasta el
momento.

Laura Cruz Reyes Grafos y Caminos


Fundamento

6 • Sea Dw=8, la distancia


mínima a w, pasando por
u.
• Sea v un nodo no visitado
en el que tenemos fijada
nuestra atención y w es
adyacente de v.
• Después de visitar v y
completado su
procesamiento, el valor de
Dw será 6

Laura Cruz Reyes Grafos y Caminos


Fundamento
6 • El último vértice en el camino
a v será un nodo ya visitado.
• De forma análoga, el vértice
anterior a v debe haberse
visitado, y así sucesivamente.
• Por tanto el valor de Dw
representa un camino desde
O hasta w utilizando como
nodos intermedios solamente
vértices que han sido ya
visitados.

Laura Cruz Reyes Grafos y Caminos


Fundamento

• Si Dv es mínimo entre
todos los vértices no
visitados,
• y si todas las aristas
tienen coste no
negativo (d ≥0),
• entonces Dv representa
el camino mínimo hasta
v.

Laura Cruz Reyes Grafos y Caminos


Algoritmo Dijkstra

Clásico
Algoritmo Dikjstra

Conjunto V //nodos del grafo

entero C [1..n] [1..n] // es la matriz de costos de las aristas

entero D [1..n] [1..n] //es la matriz de distancias mínimas


entero P [1..n] [1..n] //es un arreglo que guarda los caminos mínimos
Conjunto S //nodos visitados

entero v, w son //nodos auxiliares


entero i //índice auxiliar

Laura Cruz Reyes Grafos y Caminos


Algoritmo Dikjstra
S.insertar(1)

Para (i=2 hasta n)


D[w] =C[1,i]

Para (i=0 hasta n-1)


//busca un nodo de costo mínimo no visitado
v = nodo en V-S tal que D[v] sea mínimo
S.insertar(v) // se agrega al conjuto de visitados

Para cada nodo w que pertenece a V-S


//Actualizar si es más barato pasar por w
si D[w] > D[v]+ C[v,w]
D[w]=D[v]+ C[v,w]
P[w]=v;

Laura Cruz Reyes Grafos y Caminos


1 100
10

30
2 5

50 10 60

3 4
20

v S V D2 D3 D4 D5 P
1 1
2 1
3 4
4 1
5 3

Laura Cruz Reyes Grafos y Caminos


• Al final de la ejecución, cada posición
del arreglo P contiene el nodo
P inmediato anterior a v en el camino más
corto a partir del nodo inicial.
1 1
2 1 • El arreglo P debe tener los valores
3 4 P[2]=1, P[3]=4 , P[4]=1 y P[5]=3. Para
encontrar el camino más corto del nodo
4 1
1 al nodo 5, por ejemplo, se siguen los
5 3 predecesores en orden inverso
comenzando en 5. Así, el camino más
corto del nodo 1 al 5, es el 1, 4, 3, 5.

Laura Cruz Reyes Grafos y Caminos


Complejidad

„ El orden en tiempo de ejecución del algoritmo


de Dijkstra depende mucho de dos aspectos:

‰ Las características del grafo

‰ La estructura de almacenamiento

Laura Cruz Reyes Grafos y Caminos


Complejidad: matriz de adyacencia
„ Si se emplea una matriz de adyacencia, para
almacenar los nodos no visitados V-S, entonces
encontrar un nodo v con D mínima es O(|V|).
Esto se debe a que cada nodo puede tener a lo
más |V|-1 nodos adyacentes, y para encontrar el
menor se deben analizar todos.

„ Como el ciclo externo se ejecuta |V| veces, esta


sección del algoritmo sería O(|V|2).

Laura Cruz Reyes Grafos y Caminos


Complejidad: matriz de adyacencia

„ En el ciclo más interno, la actualización de D es


O(1).

„ En el peor caso esta actualización se realiza


para cada nodo y sus adyacentes, dando una
complejidad O(|E|) para esta sección del
algoritmo

Laura Cruz Reyes Grafos y Caminos


Complejidad: matriz de adyacencia

„ Por lo anterior, la complejidad de todo el


algoritmo sería:

O(|V|2)+O(|E|)=O(|V|2)

Laura Cruz Reyes Grafos y Caminos


Complejidad: cola de prioridad

„ Se podría emplear un árbol balanceado y


parcialmente ordenado (heap) para
organizar los nodos no visitados, y por lo
tanto se reduciría la complejidad de
encontrar un nodo v con D mínima a un orden
logarítmico O(log|V|),
„ Como el ciclo externo se ejecuta |V| veces, esta
sección del algoritmo sería O(|V|log|V|).

Laura Cruz Reyes Grafos y Caminos


Complejidad: cola de prioridad

„ En el ciclo más interno, despúes de


actualizar D, se requeriría una reconstrucción
del heap, lo cual tarda O(log|V|).
„ El total de reconstrucciones del heap sería a
lo más O(|E|), ya que esta tarea se realiza
para cada nodo con sus adyacentes.
„ Por lo tanto, la complejidad del algoritmo
seria O(|V|log|V|)+O(|E|log|V|).
„ En una matriz esparcida la complejidad sería
O(|V|log|V|), y en una densa O(|E|log|V|).
Laura Cruz Reyes Grafos y Caminos
Complejidad: cola de prioridad

„ Por lo tanto, la complejidad de todo el


algoritmo seria:
O(|V|log|V|)+O(|E|log|V|).

„ En una matriz esparcida la complejidad sería


O(|V|log|V|), ya que |V|>|E|

„ En una matriz densa la complejidad sería


O(|E|log|V|), ya que |V|>|E|

Laura Cruz Reyes Grafos y Caminos


Algoritmo de Dikjstra
utilizando cola de prioridad
Cola de prioridad
„ La cola de prioridad es una estructura apropiada para
implementar las operaciones: insertar, eliminar y minimo. La
complejidad de cada una de estas operaciones es O(log n).
„ Un método sencillo es insertar en la cola de prioridad una
nueva entrada formada de un vértice y una distancia cada vez
que se reduce la distancia de un vértice. Si el vértice ya existía
en la cola, una opción es actualiza su distancia (lo cual puede
ser más costoso) y otra es introducir una nueva entrada con
menor costo, la entrada vieja puede ser desechada llevando un
control de nodos visitados.
„ Se puede encontrar el vértice a donde movernos (el siguiente
en la búsqueda) eliminando repetidamente de la cola de
prioridad el vértice de mínima distancia hasta que salga un
vértice no visitado.

Laura Cruz Reyes Grafos y Caminos


/* Algoritmo de Dijkstra utilizando una cola de
prioridad*/

Algoritmo dijkstra (nodoOrig, tabla)

tabla es un grafo de adyacencia


v, w son nodos;
cvw es el costo de ir de v a w;
cp es una cola de nodos con prioridad;

tabla.dist = ∞;

//0 si el nodo no ha sido visitado, 1 en caso contrario


tabla[ ].extra = 0;

tabla[nodoOrig].dist = 0;

Laura Cruz Reyes Grafos y Caminos


cp.insertar(nodoOrig, 0);

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin();
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

//analiza todos nodos adyacentes de v


for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
Ejemplo 1
Ejemplo:
Datos de entrada:

D C 10
A B 12
12
A B
D B 23
87 11
A D 87 19 23

E D 43
F C D E
100 10 43
B E 11
C A 19
C F 100

Laura Cruz Reyes Grafos y Caminos


/* Algoritmo de Dijkstra utilizando una cola de
prioridad*/

Algoritmo dijkstra (nodoOrig, tabla)

tabla es un grafo de adyacencia


v, w son nodos;
cvw es el costo de ir de v a w;
cp es una cola de nodos con prioridad;

tabla.dist = ∞;

//0 si el nodo no ha sido visitado, 1 en caso contrario


tabla[].extra = 0;

tabla[nodoOrig].dist = 0;

Laura Cruz Reyes Grafos y Caminos


0 ∞
12
/* Algoritmo de Dijkstra utilizando una
A B cola de
prioridad*/
87 11
19
Algoritmo dijkstra (int nodoOrig) 23

tabla es un grafo
F de adyacencia
C D E
v, w son nodos; 100 10 43
cvw es el costo∞ de ir de
∞ v a w; ∞ ∞
cp es una cola de nodos con prioridad;
nodo no visitado

tabla.dist = ∞;

//0 si el nodo no ha sido visitado, 1 en caso contrario


tabla[].extra = 0;

tabla[nodoOrig].dist = 0;

Laura Cruz Reyes Grafos y Caminos


cp.insertar(nodoOrig, 0);

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin();
while (tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

//analiza todos nodos adyacentes de v


for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()

while 0!(tabla[v].extra)
12 // v es el nodo visitado
tabla[v].extra=1 COLA DE PRIORIDAD
A B

11 de v
//analiza todos nodos adyacentes
87
for(p= tabla[v].ady
19 ; 23
p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v ∞
(w, cvw)∞ = p.recuperar();
∞ A 0
F C D E
if (tabla[w].dist>tabla[v].dist+cvw)
100 10 43
//El costo pasando por v es más barato que el actual
∞ nodo no visitado
tabla[w].dist=tabla[v].dist+cvw;
nodo actual v
tabla[w].ant=v;
nodo visitado
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()

while0 !(tabla[v].extra)
12
tabla[v].extra=1 COLA DE PRIORIDAD
// Bv es el nodo visitado
A
//analiza todos nodos adyacentes
87 11 de v
for(p= tabla[v].ady
19 ;23p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v ∞
∞ = p.recuperar();
F
(w, cvw)
C D

E A 0
if (tabla[w].dist>tabla[v].dist+cvw)
100 10 43
∞ //El costo pasando por v es más barato que el actual
nodo no visitado
tabla[w].dist=tabla[v].dist+cvw;
nodo actual v
tabla[w].ant=v;
nodo visitado
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()

while !(tabla[v].extra)
0
tabla[v].extra=1 // v es el nodo visitado
12 COLA DE PRIORIDAD
A B
//analiza todos nodos adyacentes de v
87
for(p= tabla[v].ady ; 23 11
p.estaDentro(); p.avanzar())
//w es19el nodo adyacente de v
∞ ∞
∞ = p.recuperar();
(w, cvw)
F if (tabla[w].dist>tabla[v].dist+cvw)
C D E
10pasando por v43es más barato que el actual
100 //El costo
∞ tabla[w].dist=tabla[v].dist+cvw;
nodo no visitado
nodo actual v
tabla[w].ant=v;
nodo visitado
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 ∞
//analiza todos12nodos adyacentes de vCOLA DE PRIORIDAD
A B
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
87 11
(w, cvw) = p.recuperar();
23
19
∞ ∞
if (tabla[w].dist>tabla[v].dist+cvw)

//El costo pasando por v es más barato que el actual
F C D E
100 tabla[w].dist=tabla[v].dist+cvw;
10 43

tabla[w].ant=v;
nodo no
//inserta a visitado
la cola el nodo adyacente w
nodo actual v tabla[w].dist);
cp.insertar(w,
nodo visitado
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

//analiza todos nodos adyacentes de v


12 ∞ COLA DE PRIORIDAD
for(p=0 tabla[v].ady
A ; Bp.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
87
(w, cvw) = p.recuperar(); 11
19 23
if (tabla[w].dist>tabla[v].dist+cvw)
∞ ∞

//El costo pasando por v es más barato que el actual
F tabla[w].dist=tabla[v].dist+cvw;
C D E
10
100tabla[w].ant=v; 43
∞ //inserta
nodo a
no la cola el nodo adyacente w
visitado
nodo actual vtabla[w].dist);
cp.insertar(w,
nodo visitado
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)
12 ∞ COLA DE PRIORIDAD
A 0 B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
87 costo mínimo11
//busca un nodo de no visitado
19 23
do
∞ ∞

if(cp.esVacia())
F exit;
C D E
100 10
v = cp.eliminarMin() 43

while !(tabla[v].extra)
nodo no visitado
nodo actual
tabla[v].extra=1 // vv es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)
12 ∞ COLA DE PRIORIDAD
A 0 B
w
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
19 23
do
∞ ∞

if(cp.esVacia())
F Cexit; D E
100 10
v = cp.eliminarMin() 43
∞ while !(tabla[v].extra)
nodo no visitado
nodo actual
tabla[v].extra=1 // vv es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)
12 ∞ COLA DE PRIORIDAD
A 0 B
w
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
87 costo mínimo11no visitado
//busca un nodo de
19 23
do
∞ ∞

if(cp.esVacia())
F Cexit; D E
100 10
v = cp.eliminarMin() 43
∞while !(tabla[v].extra)
nodo no visitado
nodo actual
tabla[v].extra=1 // vv es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)
12 12 COLA DE PRIORIDAD
A 0 B
w
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
87 costo mínimo11no visitado
//busca un nodo de
19 23
do
∞ ∞

if(cp.esVacia())
F Cexit; D E
100 10
v = cp.eliminarMin() 43
∞while !(tabla[v].extra)
nodo no visitado
nodo actual
tabla[v].extra=1 // vv es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)
12 12 COLA DE PRIORIDAD
A 0 B
w
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
19 23
do
∞ ∞

if(cp.esVacia())
F Cexit; D E
100 10
v = cp.eliminarMin() 43
∞while !(tabla[v].extra)
nodo no visitado
nodo actual
tabla[v].extra=1 // vv es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
0 12
if(cp.esVacia())
A exit;12 B COLA DE PRIORIDAD
v = cp.eliminarMin()
87
while !(tabla[v].extra) 11
19 23
tabla[v].extra=1 // v es el nodo visitado
∞ ∞

F //analizaCtodos nodos adyacentes
D de vE
100 10
for(p= tabla[v].ady 43
; p.estaDentro(); B 12
p.avanzar())

nodo
//w es el no visitado
nodo adyacente de v
nodo
(w, cvw) actual v
= p.recuperar();
nodo visitado
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
11 no visitado
//busca un nodo87de costo mínimo
do 19 23
∞ ∞
if(cp.esVacia()) ∞
F C exit; D E
100 10
v = cp.eliminarMin() 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
do 19 23
∞ w ∞
if(cp.esVacia()) ∞
F C exit; D E
100 10
v = cp.eliminarMin() 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
do 19 23
∞ w ∞
if(cp.esVacia()) ∞
F C exit; D E
100 10
v = cp.eliminarMin() 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
11 no visitado
//busca un nodo87de costo mínimo
do 19 23

if(cp.esVacia()) w ∞
87
F C exit; D E
100 10
v = cp.eliminarMin() 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
11 no visitado
//busca un nodo87de costo mínimo
do 19 23

if(cp.esVacia()) w ∞
87
F C exit; D E
100 10
v = cp.eliminarMin() 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
11 no visitado
//busca un nodo87de costo mínimo
do 19 23


if(cp.esVacia()) 87 D 87
F C exit; D E
100 10
v = cp.eliminarMin() 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
11 no visitado
//busca un nodo87de costo mínimo
do 19 23


if(cp.esVacia()) 87 D 87
F C exit; D E
100v = cp.eliminarMin()
10 43 B 12
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 12
//analiza todos nodos adyacentes de v
12 COLA DE PRIORIDAD
A B
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = 87p.recuperar();11
19 23
if (tabla[w].dist>tabla[v].dist+cvw)

//El ∞costo pasando 87
por v es más barato que el actual
F tabla[w].dist=tabla[v].dist+cvw;
C D E
10
100 tabla[w].ant=v; 43 D 87
∞ //inserta
nodo noavisitado
la cola el nodo adyacente w
nodo actual v tabla[w].dist);
cp.insertar(w,
nodo visitado
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

0
//analiza 12
todos nodos adyacentes de v
12
for(p= tabla[v].ady COLA
;Bp.estaDentro(); DE PRIORIDAD
p.avanzar())
A
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();11
87
23
if (tabla[w].dist>tabla[v].dist+cvw)
19

//El costo pasando por v es más∞barato que el actual
87
tabla[w].dist=tabla[v].dist+cvw;
F C D E
100 tabla[w].ant=v;
10 43 D 87
∞ //inserta a la cola el nodo adyacente w
nodo no visitado
cp.insertar(w, tabla[w].dist);
nodo actual v
Laura Cruz Reyes nodo visitado Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
do 19 23
∞ 23
if(cp.esVacia()) 87 D 87
F C exit; D E
100 10
v = cp.eliminarMin() 43 E 23
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 12
//analizaA todos12nodos B
adyacentes de vCOLA DE PRIORIDAD
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
11 v
//w es el nodo adyacente de
87
(w, cvw)
19 23
= p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
23
∞ 87
//El costo pasando por v es más barato que el actual
F C D E
100 tabla[w].dist=tabla[v].dist+cvw;
10 43 D 87
∞ tabla[w].ant=v;
nodo noavisitado
//inserta la cola el nodo adyacente w
nodo actual v
cp.insertar(w, tabla[w].dist);
nodo visitado
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

0
//analiza 12
todos nodos adyacentes de v
12
for(p= tabla[v].ady COLA
; Bp.estaDentro(); DE PRIORIDAD
p.avanzar())
A
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();11
87
23
if (tabla[w].dist>tabla[v].dist+cvw)
19
∞ 87 23
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
F C D E
100 tabla[w].ant=v;
10 43 D 87
∞ //inserta a la cola el nodo adyacente w
nodo no visitado
cp.insertar(w, tabla[w].dist);
nodo actual v
Laura Cruz Reyes nodo visitado Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
11 no visitado
//busca un nodo de costo mínimo
87
do 19 23
if(cp.esVacia()) 23
∞ 66 D 87
exit;
F C D E
100
v = cp.eliminarMin()
10 43 D 66
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1 // v es el nodo visitado
nodo actual v
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 12
12 COLA DE PRIORIDAD
A B
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
87 adyacente de11v
//w es el nodo
19 23
(w, cvw) = p.recuperar();
∞ 66 23
if (tabla[w].dist>tabla[v].dist+cvw)
F C costo pasando
//El D por v es másEbarato que el actual
100 tabla[w].dist=tabla[v].dist+cvw;
10 43 D 87
∞ tabla[w].ant=v;
nodo no visitado
nodo actual
//inserta a lav cola el nodo adyacente w
nodo visitado tabla[w].dist);
cp.insertar(w,
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

0
//analiza 12
todos nodos adyacentes de v
12
for(p= tabla[v].ady COLA
;B p.estaDentro(); DE PRIORIDAD
p.avanzar())
A
//w es el nodo adyacente de v
(w, cvw) = p.recuperar(); 11
87
23
if (tabla[w].dist>tabla[v].dist+cvw)
19
//El ∞costo pasando por v es más barato
23 que el actual
66
tabla[w].dist=tabla[v].dist+cvw;
F C D E
100 tabla[w].ant=v;
10 43 D 87
∞ //inserta a la cola el nodo adyacente w
nodo no visitado
cp.insertar(w, tabla[w].dist);
nodo actual v
Laura Cruz Reyes nodo visitado Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
do 19 23
23
if(cp.esVacia())
76 66 D 87
F C exit; D E
100 10
v = cp.eliminarMin() 43 C 76
∞ while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 12
//analiza todos 12
nodos adyacentes de v COLA DE PRIORIDAD
A B
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
87 11
(w, cvw) = p.recuperar();
23
19
if (tabla[w].dist>tabla[v].dist+cvw)
76 23
66 v es más barato
//El costo pasando por que el actual
F C D E
tabla[w].dist=tabla[v].dist+cvw;
100 10
tabla[w].ant=v;
43 D 87

nodo noa visitado
//inserta la cola el nodo adyacente w
nodo actual v tabla[w].dist);
cp.insertar(w,
nodo visitado
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

0
//analiza 12
todos nodos adyacentes de v
12 COLA DE PRIORIDAD
A
for(p= tabla[v].ady B
; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
87 11
19 23
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por
76 23
66 v es más barato que el actual
F tabla[w].dist=tabla[v].dist+cvw;
C D E
10
100 tabla[w].ant=v; 43 D 87
∞ //inserta a la cola el nodo adyacente w
nodo no visitado
cp.insertar(w,
nodo actual v tabla[w].dist);
Laura Cruz Reyes
nodo visitado Grafos y Caminos
0 12
cp.insertar(nodoOrig,
12
0)
A B COLA DE PRIORIDAD
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
19 23
do
23
76
if(cp.esVacia()) 66 F 175
F C exit; D E
100 10
v = cp.eliminarMin() 43 D 87
175
while !(tabla[v].extra)
nodo no visitado
nodo actual//
tabla[v].extra=1 v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 12
//analizaAtodos 12 B
nodos adyacentes de v COLA DE PRIORIDAD
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
87 adyacente de11v
//w es el nodo
23
19 = p.recuperar();
(w, cvw)
23
if
76 (tabla[w].dist>tabla[v].dist+cvw)
//El
v 66 F 175
F C costo pasando
D por v es másEbarato que el actual
10 43
100 tabla[w].dist=tabla[v].dist+cvw;
175 tabla[w].ant=v;
nodo no visitado
//inserta a lav cola el nodo adyacente w
nodo actual
cp.insertar(w,
nodo visitado tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado
0 12
//analizaAtodos 12 B
nodos adyacentes de v COLA DE PRIORIDAD
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
87 adyacente de11v
//w es el nodo
23
19 = p.recuperar();
(w, cvw)
v
if 23
76 (tabla[w].dist>tabla[v].dist+cvw)
66
//El
C costo pasando
D por v es másEbarato que el actual
F
10 43
100 tabla[w].dist=tabla[v].dist+cvw;
175 tabla[w].ant=v;
nodo no visitado
//inserta a lav cola el nodo adyacente w
nodo actual
cp.insertar(w,
nodo visitado tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
tabla[v].extra=1 // v es el nodo visitado

0
//analiza 12
todos nodos adyacentes de v
12 COLA DE PRIORIDAD
A
for(p= tabla[v].ady B
; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
87 11
19 23
if (tabla[w].dist>tabla[v].dist+cvw)
v
//El costo pasando por
76 23
66 v es más barato que el actual
F tabla[w].dist=tabla[v].dist+cvw;
C D E
10
100 tabla[w].ant=v; 43
175 //inserta a la cola el nodo adyacente w
nodo no visitado
cp.insertar(w,
nodo actual v tabla[w].dist);
Laura Cruz Reyes
nodo visitado Grafos y Caminos
0
cp.insertar(nodoOrig, 0) 12
12 COLA DE PRIORIDAD
A B
for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
//busca un nodo 87 11 no visitado
de costo mínimo
do 19 23
v
if(cp.esVacia())
76 66 23
F C exit; D E
100 10
v = cp.eliminarMin() 43
175
while !(tabla[v].extra)
nodo no visitado
tabla[v].extra=1
nodo actual//
v v es el nodo visitado
nodo visitado
//analiza todos nodos adyacentes de v
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
//w es el nodo adyacente de v
(w, cvw) = p.recuperar();
if (tabla[w].dist>tabla[v].dist+cvw)
//El costo pasando por v es más barato que el actual
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
//inserta a la cola el nodo adyacente w
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
cp.insertar(nodoOrig, 0)

for(nodosVistos=0; nodosVistos<numVertice; nodosVistos++)


//busca un nodo de costo mínimo no visitado
do
if(cp.esVacia())
exit;
v = cp.eliminarMin()
while !(tabla[v].extra)
0
tabla[v].extra=1 12 el nodo visitado
// v es
12 COLA DE PRIORIDAD
A B
//analiza todos nodos adyacentes de v
87 11
for(p= tabla[v].ady ; p.estaDentro(); p.avanzar())
23
//w es19el nodo adyacente de v
v (w, cvw) = p.recuperar();
76 66 23
if (tabla[w].dist>tabla[v].dist+cvw)
F C D E
100 //El costo10pasando por v43es más barato que el actual
175 tabla[w].dist=tabla[v].dist+cvw;
nodo no visitado
tabla[w].ant=v;
nodo actual v
//inserta a la cola el nodo adyacente w
nodo visitado
cp.insertar(w, tabla[w].dist);
Laura Cruz Reyes Grafos y Caminos
Ejemplo 2
Datos de entrada:

D C 10
12
A B 12 A B

D B 23 87 11
19 23
A D 87
C D E
E D 43 10 43

B E 11
C A 19

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 ∞
12 COLA DE PRIORIDAD
A B

87 11
19 23

∞ ∞
C D E
10 43
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 ∞
12 COLA DE PRIORIDAD
A B

87 11
19 23


C D

E A 0
10 43
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 ∞
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ ∞

C D E
10 43
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 ∞
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ ∞

C D E
10 43
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23

∞ 87 D 87
C D E
10 43 B 12
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ ∞
87
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ ∞
87
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ 23
87 D 87
C D E
10 43 E 23
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ 87 23
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ 87 23
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ 23
66 D 87
C D E
10 43 D 66
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ 66 23
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
∞ 66 23
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
23
76 66 D 87
C D E
10 43 C 76
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
76 66 23
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Continuación…

0 12
12 COLA DE PRIORIDAD
A B

87 11
19 23
76 66 23
C D E
10 43 D 87
nodo no visitado
nodo actual v
nodo visitado

Laura Cruz Reyes Grafos y Caminos


Ejemplo 3

Laura Cruz Reyes Grafos y Caminos


Continuación…

Laura Cruz Reyes Grafos y Caminos


Continuación…

Laura Cruz Reyes Grafos y Caminos


Continuación…

Laura Cruz Reyes Grafos y Caminos


Implementación en Java
Códigos
/**
* Inicializa la tabla.
*/

private void limpiarDatos( )


{
for(int i=0; i<numVertices; i++)
{
tabla[i].dist=INFINITO;
tabla[i].ant=VERTICE_NULO;
tabla[i].extra=0;
}
}

Laura Cruz Reyes Grafos y Caminos


/* Objeto almacenado en la cola de prioridad en el algoritmo
Dijkstra
*/
class Camino implements Comparable
{
int dest; //w
int coste; //D(w)
static Camino infNeg=new Camino(); //Centinela

Camino( )
{this (0);}

Camino(int d)
{this (d, 0);}

Camino(int d, int c)
{dest=d, coste=c;}

public boolean menorQue( Comparable lder)


{ return coste <((Camino) lder).coste;}

public int compara (Comparable lder)


{ return coste < ((Camino)lder).coste ? -1:
coste >((Camino) lder).coste ? 1:0;}
}
Laura Cruz Reyes Grafos y Caminos
/* Algoritmo de Dijkstra utilizando un Montículo Binario
Devuelve false si se detecta aristas negativs
*/
private boolean dijkstra (int nodoOrig)
{
int v, int w;
ColaPrioridad cp= new MontículoBinario (Camino.infNeg);
Camino vrec; // recibe los elementos que sacan de la pila que es nodo y costo

limpiarDatos( );
tabla[nodoOrig].dist=0;
cp.insertar(new Camino(nodoOrig, 0));

try
{
for(int nodosVistos=0; nodosVistos<numVertice; nodosVistos++)
{
do
{
if(cp.esVacia())
return true;
vrec=(Camino)cp.eliminarMin();
}

Laura Cruz Reyes Grafos y Caminos


v=vrec.dest;
tabla[v].extra=1;
ListaIter p= new ListaEnlazadaIter(tabla[v].ady);
//analiza todos los pesos de los adyacentes del nodo actual
for( ; p.estaDentro(); p.avanzar())
{
w=((Arista)p.recuperar()).dest;
int cvw=((Arista)p.recuperar()).coste;
if( cvw < 0)
return false;

if (tabla[w].dist>tabla[v].dist+cvw)

//El costo de adyacente es mayor que el costo del actual + lo q cuesta ir del
actual al adyacente
{
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
cp.insertar(new Camino(w, tabla[w].dist));
}
}
}
}
catch(DesbordamientoInferior e){ } //No puede ocurrir

return true;
Laura Cruz Reyes Grafos y Caminos
}
EJEMPLO:
NodoInicial
Datos de entrada:
12
D C 10
A B
A B 12 11
87
D B 23 19 23

A D 87 C D E
10 43
E D 43
B E 11
C A 19
Laura Cruz Reyes Grafos y Caminos
limpiarDatos( );
Nomb dist ant extra ady
re

0 A ∞ -1 0 BD
1 B ∞ -1 0 E
2 C ∞ -1 0 A
3 D ∞ -1 0 BC
4 E ∞ -1 0 D
Donde:
dist = Coste después de ejecutar el algoritmo
ant = vértice anterior en el camino mínimo
Laura Cruzextra
Reyes = Variable extra usadaGrafos
por yel algoritmo
Caminos
0

tabla[nodoOriginal].dist = 0

Nom dist ant extra ady


bre

0 A 0 -1 0 BD Inserta en la cola de
prioridad
1 B ∞ -1 0 E

2 C ∞ -1 0 A

3
D ∞ -1 0 BC
E ∞ -1 0 D 0 0
4

Nodo Coste

Laura Cruz Reyes Grafos y Caminos


nodosVistos = 0 vrec = 0, 0
cp.esVacia( ): NO v=0

Se elimina el nodo con tabla[v].extra = 1


peso minimo de la cola de
prioridad Nom dist ant extra ady
bre

0 A 0 -1 1 BD

0,0 1 B ∞ -1 0 E

2 C ∞ -1 0 A
Nodo Coste
3
D ∞ -1 0 BC
E ∞ -1 0 D
4
Laura Cruz Reyes Grafos y Caminos
p=B // se asigna el primer elemento de la lista ady
w=1 // recupera el valor de dest de B
cvw = 12 // recupera el coste

Si (∞> 0 + 12)
tabla[1].dist = 0 + 12 =12
Inserta en la cola de
tabla[1].ant = 0 prioridad

Nom dist ant extra ady


bre

0 A 0 -1 1 BD
1 B 12 0 0 E
1 12

2 C ∞ -1 0 A
Nodo Coste
3
D ∞ -1 0 BC
E ∞ -1 0 D
4Laura Cruz Reyes Grafos y Caminos
p=D // se asigna el siguiente elemento de la lista ady
w=3 // recupera el valor de dest de D
cvw = 87 // recupera el coste

Si (∞> 0 + 87)
tabla[3].dist = 0 + 87 =87
Inserta en la cola de
tabla[3].ant = 0 prioridad

Nom dist ant extra ady


bre

0 A 0 -1 1 BD
1 B 12 0 0 E 3 87
1 12

2 C ∞ -1 0 A
Nodo Coste
3
D 87 0 0 BC
E ∞ -1 0 D
4Laura Cruz Reyes Grafos y Caminos
nodosVistos = 1 vrec = 1, 12
cp.esVacia( ): NO v=1

Se elimina el nodo con tabla[v].extra = 1


peso minimo de la cola de
prioridad Nom dist ant extra ady
bre

0 A 0 -1 1 BD
1,12 1 B 12 0 1 E
3 87
2 C ∞ -1 0 A
Nodo Coste
3
D 87 0 0 BC
E ∞ -1 0 D
4
Laura Cruz Reyes Grafos y Caminos
p=E // se asigna el primer elemento de la lista ady
w=4 // recupera el valor de dest de E
cvw = 11 // recupera el coste

Si (∞> 12 + 11)
tabla[4].dist = 12 + 11 =23
Inserta en la cola de
tabla[4].ant = 1 prioridad

Nom dist ant extra ady


bre

0 A 0 -1 1 BD
3 87
1 B 12 0 1 E 4 23

2 C ∞ -1 0 A
Nodo Coste
3
D 87 0 0 BC
E 23 1 0 D
4Laura Cruz Reyes Grafos y Caminos
nodosVistos = 2 vrec = 4, 23
cp.esVacia( ): NO v=4

Se elimina el nodo con tabla[v].extra = 1


peso minimo de la cola de
prioridad Nom dist ant extra ady
bre

0 A 0 -1 1 BD
4,23 1 B 12 0 1 E
3 87
2 C ∞ -1 0 A
Nodo Coste
3
D 87 0 0 BC
E 23 1 1 D
4
Laura Cruz Reyes Grafos y Caminos
p=D // se asigna el primer elemento de la lista ady
w=3 // recupera el valor de dest de D
cvw = 43 // recupera el coste

Si (87> 23 + 43)
tabla[3].dist = 23 + 43 =66
Inserta en la cola de
tabla[3].ant = 4 prioridad

Nom dist ant extra ady


bre

0 A 0 -1 1 BD
1 B 12 0 1 E 3 87
3 66

2 C ∞ -1 0 A
Nodo Coste
3
D 66 4 0 BC
Se actualiza el
E 23 1 1 D costo de 3 por 66
4Laura Cruz Reyes Grafos y Caminos
nodosVistos = 3 vrec = 3, 66
cp.esVacia( ): NO v=3

Se elimina el nodo con tabla[v].extra = 1


peso minimo de la cola de
prioridad Nom dist ant extra ady
bre

0 A 0 -1 1 BD
3,66 1 B 12 0 1 E
3 87
2 C ∞ -1 0 A
Nodo Coste
3
D 66 4 1 BC
E 23 1 1 D
4
Laura Cruz Reyes Grafos y Caminos
p=B // se asigna el primer elemento de la lista ady
w=1 // recupera el valor de dest de B
cvw = 23 // recupera el coste

Si (12> 66 + 23)

NO // Por lo tanto no se hace nada

Laura Cruz Reyes Grafos y Caminos


p=C // se asigna el siguiente elemento de la lista ady
w=2 // recupera el valor de dest de C
cvw = 10 // recupera el coste

Si (∞ > 66 + 10)
tabla[2].dist = 66 + 10 = 76
Inserta en la cola de
tabla[2].ant = 3 prioridad

Nom dist ant extra ady


bre

0 A 0 -1 1 BD
3 87
1 B 12 0 1 E 2 76

2 C 76 3 0 A
Nodo Coste
3
D 66 4 1 BC
E 23 1 1 D
4Laura Cruz Reyes Grafos y Caminos
nodosVistos = 4 vrec = 2, 76
cp.esVacia( ): NO v=2

Se elimina el nodo con tabla[v].extra = 1


peso minimo de la cola de
prioridad Nom dist ant extra ady
bre

0 A 0 -1 1 BD
2,76 1 B 12 0 1 E
3 87
2 C 76 3 1 A
Nodo Coste
3
D 66 4 1 BC
E 23 1 1 D
4
Laura Cruz Reyes Grafos y Caminos
p=A // se asigna el primer elemento de la lista ady
w=0 // recupera el valor de dest de A
cvw = 19 // recupera el coste

Si (0 > 76 + 19)

NO // Por lo tanto no se hace nada

//Se termina el ciclo


Laura Cruz Reyes Grafos y Caminos
Por lo tanto la matriz final es:

Nom dist ant extra ady


bre

0 A 0 -1 1 BD
1 B 12 0 1 E

2 C 76 3 1 A

3
D 66 4 1 BC
E 23 1 1 D
4

En donde se puede observar los costes mínimos y el camino


que se sigue para llegar a cada nodo desde el nodo inicial A

Laura Cruz Reyes Grafos y Caminos


NodoOriginal = B

Nom dist ant extra ady


bre

0 A 81 2 1 BD
1 B 0 -1 1 E

2 C 64 3 1 A

3
D 54 4 1 BC
E 11 1 1 D
4

Laura Cruz Reyes Grafos y Caminos

Potrebbero piacerti anche