Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
• 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.
Clásico
Algoritmo Dikjstra
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
La estructura de almacenamiento
O(|V|2)+O(|E|)=O(|V|2)
tabla.dist = ∞;
tabla[nodoOrig].dist = 0;
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
tabla.dist = ∞;
tabla[nodoOrig].dist = 0;
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 = ∞;
tabla[nodoOrig].dist = 0;
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)
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)
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)
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)
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)
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)
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
0 ∞
12 COLA DE PRIORIDAD
A B
87 11
19 23
∞
∞ ∞
C D E
10 43
nodo no visitado
nodo actual v
nodo visitado
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
0 ∞
12 COLA DE PRIORIDAD
A B
87 11
19 23
∞ ∞
∞
C D E
10 43
nodo no visitado
nodo actual v
nodo visitado
0 ∞
12 COLA DE PRIORIDAD
A B
87 11
19 23
∞ ∞
∞
C D E
10 43
nodo no visitado
nodo actual v
nodo visitado
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
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
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
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
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
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
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
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
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
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
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
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
Camino( )
{this (0);}
Camino(int d)
{this (d, 0);}
Camino(int d, int c)
{dest=d, coste=c;}
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();
}
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
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
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
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
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
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
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
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
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
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)
Si (∞ > 66 + 10)
tabla[2].dist = 66 + 10 = 76
Inserta en la cola de
tabla[2].ant = 3 prioridad
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
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)
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
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