Documentos de Académico
Documentos de Profesional
Documentos de Cultura
C++
10/09/2019
Algoritmo de Dijkstra
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.
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
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
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
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
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
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
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.
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.
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.
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
}