Está en la página 1de 25

Algoritmo de Dijkstra

C++

10/09/2019
Algoritmo de Dijkstra

1. Visita los vértices no visitados por la menor distancia.

2. Para el vértice actual examinar que vértices no hemos visitado.

3. Para el vértice actual calcular la distancia de cada vecino al vértice


inicial

4. Si la distancia calculada de un de los vértices es menor a la


anteriormente conocida, reemplazarla.

5. Añadir el vértice visitado a la lista.

6. Si faltan visitar regresar al nodo 1.

10/09/2019
Algoritmo de Dijkstra

6
A B

1 C
2 2

D E
1

10/09/2019
Algoritmo de Dijkstra
C++
Entradas = Matriz de adyacencia, número de vértices, vértice de inicio.

Salida = Distancias a cada nodo

6
A B

5
 0 6 0 1 0
 6 0 5 2 2
 0 5 0 0 5
1 C
2 2  1 2 0 0 1
 0 2 5 1 0
5

D E Matriz de adyacencia
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
DEFINIR COMO CONSTANTES INFINITO Y MAXIMO (NRO DE NODOS)
DEFINIR LA FUNCION DIJKSTRA CON LAS VARIABLES DE ENTRADA
PROGRAMAR LA FUNCIÓN PRINCIPAL CON LOS DATOS DEL GRAFO Y LLAMAR A
DIJSKTRA

6  #define infinito 9999


A B  #define max 5

5  void dijkstra(int G[max][max],int n,int nodo_inicio);

 int main() { int G[max][max]={{0,6,0,1,0},{6,0,5,2,2},{0,5,0,0,5},


{1,2,0,0,1},{0,2,5,1,0}};
 int n=5;
1 C  int u=0;
2 2  dijkstra(G,n,u);
 return 0;
}
5

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
PROGRAMAR LA FUNCIÓN DIJSKTRA
DEFINIMOS:
• TABLAS (MATRIZ): COSTOS TOTALES.
• LISTAS (VECTOR):DISTANCIAS PARA EL NODO ACTUAL, NODOS PREDECESORES EN
EL CAMINO, NODOS VISITADOS.
• VARIABLES: CONTEO, MINIMA DISTANCIA, NODO SIGUIENTE, COORDENADAS
6
A B

5
 void dijkstra(int G[max][max],int n,int nodo_inicio) {
 int costo[max][max],distancia[max],pred[max];
C  int visitados[max],conteo,mindistancia,nodo_sig,i,j;
1
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
CREAR MATRIZ DE COSTO A PARTIR DE LA DE ADYACENCIA

 0 6 0 1 0  INF 6 INF 1 INF


 6 0 5 2 2  6 INF 5 2 2
 0 5 0 0 5  INF 5 INF INF 5
 1 2 0 0 1  1 2 INF INF 1
 0 2 5 1 0  INF 2 5 1 INF

10/09/2019
Algoritmo de Dijkstra
OCTAVE
CREAR MATRIZ DE COSTO A PARTIR DE LA DE ADYACENCIA

for(i=0;i<n;i++){
 INF 6 INF 1 INF  for(j=0;j<n;j++){
 6 INF 5 2 2  if(G[i][j]==0)
 INF 5 INF INF 5  costo[i][j]=infinito;
 else
 1 2 INF INF 1
 costo[i][j]=G[i][j];
 INF 2 5 1 INF }
}

10/09/2019
Algoritmo de Dijkstra
OCTAVE
INICIAMOS MATRIZ VISITADOS

INICIALMENTE NINGUNO ESTA VISITADO

MARCAMOS EL NODO INICIO COMO VISITADO

Visitados=[0 0 0 0 0]
 for(i=0;i<n;i++) {
Visitados=[1 0 0 0 0]  visitados[i]=0;
 }
 visitados[nodo_inicio]=1;

10/09/2019
Algoritmo de Dijkstra
OCTAVE
CREAMOS EL VECTOR DE DISTANCIAS

CONTIENE EL COSTO DESDE EL NODO EVALUADO HASTA CADA NODO

LO INICIAMOS CON LOS VALORES PARA EL NODO DE INICIO

LA DISTANCIA AL NODO INICIO ES 0

for(i=0;i<n;i++) {
distancia=[0 6 0 1 0]
distancia[i]=costo[nodo_inicio][i];
}

distancia[nodo_inicio]=0;

10/09/2019
Algoritmo de Dijkstra
OCTAVE
CREAMOS EL VECTOR DE NODOS PREDECESORES

INCIAMOS LOS ELEMENTOS DE ESTE VECTOR COMO EL NODO DE INICIO

 for(i=0;i<n;i++) {
predecesores=[0]
 pred[i]=nodo_inicio;
 }

10/09/2019
Algoritmo de Dijkstra
OCTAVE
INICIAMOS EL CONTEO EN 1

Visitados=[1 0 0 0 0]  for(i=0;i<n;i++) {
distancia=[0 6 0 1 0]  pred[i]=nodo_inicio;
 }
predecesores=[0]

 conteo=1;

10/09/2019
Algoritmo de Dijkstra
OCTAVE
HAREMOS EL PROCESO MIENTRAS EL CONTEO NO SEA MAYOR QUE LA CANTIDAD DE
NODOS

INICIAMOS MINDISTANCIA COMO INFINITO

6
A B

5
 while(conteo<n-1) {
1 C
2 2  mindistancia=infinito;

D E
1
10/09/2019
mindistancia=infinito
Algoritmo de Dijkstra
OCTAVE
EVALUAMOS PARA TODAS LAS DISTANCIAS DEL NODO ACTUAL.

6
A B

5 for(i=0;i<n;i++)

1 C
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
EVALUAMOS PARA TODAS LAS DISTANCIAS DEL NODO ACTUAL.

SI LA DISTANCIA AL NODO EVALUADO ES MENOR A LA DISTANCIA A LOS NODOS NO VISITADOS.

6
A B

5 for(i=0;i<n;i++)

1 C
if(distancia[i]<mindistancia&&!visitados[i])
2 2

D E
1
10/09/2019

mindistancia=infinito Visitados=[1 0 0 0 0]
Algoritmo de Dijkstra
OCTAVE
EVALUAMOS PARA TODAS LAS DISTANCIAS DEL NODO ACTUAL.

SI LA DISTANCIA AL NODO EVALUADO ES MENOR A LA DISTANCIA A LOS NODOS NO VISITADOS.

DE SER ASI ACTUALIZAMOS LA DISTANCIA MINIMA Y ESTABLECEMOS ESE NODO COMO EL NODO
SIGUIENTE.
6
A B

5 for(i=0;i<n;i++)

1 C
if(distancia[i]<mindistancia&&!visitados[i]) {
2 2 mindistancia=distancia[i];
nodo_sig=i;
5 }
D E
1
10/09/2019

mindistancia=0 distancia=[0 6 0 1 0]
Algoritmo de Dijkstra
OCTAVE
ACTUALIZAMOS VISITADOS CON EL NODO_SIG

A B

5 visitados[nodo_sig]=1;

1 C
2 2

Visitados=[1 0 0 1 0]
5

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
EVALUAMOS PARA TODAS LAS DISTANCIAS DEL NODO ACTUAL HASTA ENCONTRAR UN NO
VISITADO

A B for(i=0;i<n;i++){
5 if(!visitados[i]){

1 C
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
SI LA DISTANCIA MINIMA ANTERIORMENTE ENCONTRADA MAS EL COSTO DEL NODO SIGUIENTE
AL NODO EVALUADO ES MENOR A LA DISTANCIA AL NODO EVALUADO.

A B for(i=0;i<n;i++){
5 if(!visitados[i]){
if(mindistancia+costo[nodo_sig][i]<distancia[i]) {

1 C
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
DE SER ASI ACTUALIZAMOS LA DISTANCIA AL NODO EVALUADO CON ESE VALOR Y AGREGAMOS
EL NODO SIGUIENTECOMO PREDECESOR.

6
A B for(i=0;i<n;i++){
5 if(!visitados[i]){
if(mindistancia+costo[nodo_sig][i]<distancia[i]) {
distancia[i]=mindistancia+costo[nodo_sig][i];
1
2
C pred[i]=nodo_sig;
2
}
}
5

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
AUMENTAMOS EL CONTEO Y CERRAMOS EL WHILE.

6
A B for(i=0;i<n;i++){
5 if(!visitados[i]){
if(mindistancia+costo[nodo_sig][i]<distancia[i]) {
distancia[i]=mindistancia+costo[nodo_sig][i];
1
2
C pred[i]=nodo_sig;
2
}
}
5
conteo++;
D E }
1
}
10/09/2019
Algoritmo de Dijkstra
OCTAVE
PARA TODOS LOS NODOS QUE SEAN DISTINTOS AL NODO DE INICIO.

for(i=0;i<n;i++)
6
A B
if(i!=nodo_inicio) {
5

1 C
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
IMPRIMIMOS UN MENSAJE INDICANDO QUE NODO Y QUE CAMINO

for(i=0;i<n;i++)
6
A B
if(i!=nodo_inicio) {
5 cout<<"\n distancia del nodo "<<i<<" = "<<distancia[i];
cout<<"\n El camino es "<<i;

1 C
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
INICIAMOS j CON EL NODO EVALUADO

for(i=0;i<n;i++)
6
A B
if(i!=nodo_inicio) {
5 cout<<"\n distancia del nodo "<<i<<" = "<<distancia[i];
cout<<"\n El camino es "<<i;

1 C j=i;
2 2

D E
1
10/09/2019
Algoritmo de Dijkstra
OCTAVE
HACEMOS QUE j TOME EL VALOR ENCONTRADO EN LA LISTA DE NODOS PREDECESORES E
IMPRIMIMOS DICHO VALOR.

MIENTRAS j SEA DISTINTO AL NODO DE INICIO

for(i=0;i<n;i++)
6
A B
if(i!=nodo_inicio) {
5 cout<<"\n distancia del nodo "<<i<<" = "<<distancia[i];
cout<<"\n El camino es "<<i;

1 C j=i;
2 2

do {
5 j=pred[j];
D E
cout<<" ------ "<<j;
1 }while(j!=nodo_inicio);
10/09/2019
}

También podría gustarte