Os dejo el algoritmo de Dijkstra en C, realizado por el método de los algoritmos Voraces. Espero que os sesa útil!!
#include <stdio.h>
#include <stdlib.h>
#define MAX 7
#define DISTMAX 998
int seleccionados(int *selec){
int i;
for(i=0;i<MAX;i++)
if(selec[i]==0)
return 0;
return 1;
}
void shortpath(int coste[][MAX],int *ant,int *distancia){
int selec[MAX]={0};
int actual=0,i,k,dc,menordist,nuevadist;
for(i=0;i<MAX;i++)
distancia[i]=DISTMAX;
selec[actual]=1;
distancia[0]=0;
actual=0;
while(!seleccionados(selec)){
menordist=DISTMAX;
dc=distancia[actual];
for(i=0;i<MAX;i++){
if(selec[i]==0){
nuevadist=dc+coste[actual][i];
if(nuevadist<distancia[i]){
distancia[i]=nuevadist;
ant[i]=actual;
}//if
if(distancia[i]<menordist){
menordist=distancia[i];
k=i;
}//if(disstance..
}//if(selec..
}//for
actual=k;
selec[actual]=1;
}
}
int main(){
//Inicializamos
int coste[MAX][MAX]={{DISTMAX,2,4,7,DISTMAX,5,DISTMAX},{2,DISTMAX,DISTMAX,6,3,DISTMAX,8},{4,DISTMAX,DISTMAX,DISTMAX,DISTMAX,6,DISTMAX},{7,6,DISTMAX,DISTMAX,DISTMAX,1,6},{DISTMAX,3,DISTMAX,DISTMAX,DISTMAX,DISTMAX,7},{5,DISTMAX,6,1,DISTMAX,DISTMAX,6},{DISTMAX,8,DISTMAX,6,7,6,DISTMAX}};
printf("\n Vamos a mostrar el arbol");
for(int j=0;j<MAX;j++){
printf("\n\n");
for (int h=0;h<MAX;h++)
printf("\norigen %d destino %d coste %d ", j,h,coste[j][h]);
// coste %d ", j,h,coste[j][h]);
}
int i,ant[MAX]={0},distancia[MAX];
shortpath(coste,ant,distancia);
printf("\n");
for(i=0;i<MAX;i++)
printf("\nEl coste al nodo %d es %d\n",i,distancia[i]);
printf("\n");
system("PAUSE");
return 0;
}
muy bueno. gracias loco
ResponderEliminarHola, sabes como hacer que el programa pida el nodo de inicio por pantalla y ademas muestre por los nodos que pasa para llegar a cada nodo?
ResponderEliminarHola Jose, la solución que pides sería cambiando la asignación inicial por:
Eliminarprintf("\n\n Introduce el valor de nodos: ");
scanf("%d",&n);
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf(" Introduce el peso entre los nodos [%d][%d]: ",i,j);
scanf("%d",&matriz[i][j]);
}
}
Y para que muestre los nodos por los que pasa debería bastar con mostrar la variable 'i' de la función shorpath.
gracias por el codigo y tu explicacion amigo, una pregunta en que IDE trabjas c?
ResponderEliminargracias por el codigo y tu explicacion amigo, una pregunta en que IDE trabjas c?
ResponderEliminarNinguno en especial, el Dev c funciona bien para este tipo de algoritmos...
EliminarGracias por el aporte Me sirvio
ResponderEliminarBuen aporte amigo ..... perdona la pregunta en que seccion de vuestro codigo puedo implementar una seccion para que memuestre tambien por que nodos a recorrido para llegar el costo total saludos !!
ResponderEliminarGracias! en el while en funcion de si es elegida la "nuevadist" o no podrias mostrar la posicion en la que estas. Ya que solo se van guardando las distancias, no los nodos es la unica manera de hacerlo. Si no se podria modificar algo, anadir un vector almacenando los nodos y mostrarlo al final. Un saludo!
Eliminar