You are on page 1of 8

1) Determinar qu problema resuelve el algoritmo?

El algoritmo de Dijkstra resuelve el problema para la determinacin del camino ms corto dado un vrtice origen
al resto de vrtices en un grafo con pesos en cada arista.
La idea subyacente en este algoritmo consiste en ir explorando todos los caminos ms cortos que parten del
vrtice origen y que llevan a todos los dems vrtices; cuando se obtiene el camino ms corto desde el vrtice
origen, al resto de vrtices que componen el grafo, el algoritmo se detiene. El algoritmo es una especializacin de
la bsqueda de costo uniforme, y como tal, no funciona en grafos con aristas de costo negativo (al elegir siempre
el nodo con distancia menor, pueden quedar excluidos de la bsqueda nodos que en prximas iteraciones
bajaran el costo general del camino al pasar por una arista con costo negativo).
2) Estructura de datos del algoritmo?
Este algoritmo utiliza un tipo de estructura de colas llamado cola de prioridad. Una cola de prioridad es una
estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada
uno.
3) Cmo funciona el algoritmo
1- Seleccionamos el nodo no visitado con menor distancia acumulada( al iniciar, este ser siempre el nodo de
inicio).
2- Sumamos la distancia acumulada en dicho nodo con la distancia de las aristas a los nodos a los que podemos
acceder. Comparamos la nueva distancia con la que tenamos acumulada en el nodo destino (en caso de tener
ya alguna) y nos quedamos con la menor.
3- Marcamos el nodo actual como visitado y volvemos al paso 1.
- Seguimiento pas a paso ejemplo.




























4) Mostrar aplicaciones o usos del algoritmo.
APLICACIN: El Algoritmo de Dijkstra realiza O(v2) operaciones (sumas y comparaciones) para determinar la
longitud del camino ms corto entre dos vrtices de un grafo ponderado simple, conexo y no dirigido con n
vrtices, esto sin utilizar cola de prioridad.
O((|E|+|V|) log |V|) utilizando cola de prioridad (por ejemplo un montculo).
USO: Este algoritmo se usa bastante en redes de computadores, los nodos corresponden a routers y las aristas
entre ellos las conexiones, a cada conexin se le asigna un costo (distancia) y de esta manera algunos
protocolos de enrutamiento usan el algoritmo de Dijkstra para encontrar la mejor ruta entre nodos.

5) Mostrar cdigo fuente del algoritmo.

// Declaraciones en el archivo .h
//Para usar Dijkstra, no tiene que haber aristas con peso negativo, por lo tanto
//se puede tomar a infinito como -1
const int INF = -1;
int cn;
//cantidad de nodos
vector< vector<int> > ady;
//matriz de adyacencia

deque<int> path;
// camino mnimo de dijkstra

int caminosPosibles;
// cantidad de caminos posibles


vector<int> dijkstra(int nodo, int final = 0);
// el parmetro 'final' es opcional

// Devuelve un vector con las distancias mnimas del nodo inicial al resto de los vertices.
// Guarda en path los nodos que forman el camino mnimo y muestra la cantidad de caminos posibles
vector<int> Grafo :: dijkstra(int inicial, int final){
vector<int> distancias;

caminosPosibles = 0;


//decremento para manejarme en [0, cn)


// Seteo las distancias en infinito y marco todos los nodos como no visitados
for(int i = 0; i < cn; i++){
distancias.push_back(INF);
noVisitados.push_back(i);
}


// Actual es el nodo inicial y la distancia a si mismo es 0
int actual = inicial;
distancias[inicial] = 0;


// Inicializo el camino mnimo en infinito.
path = deque<int>(cn, INF);

while(!noVisitados.empty()){

// Para cada nodo no visitado, calculo la distancia tentativa al nodo actual;
// si es menor que la distancia seteada, la sobreescribo.
for(itList = noVisitados.begin(); itList != noVisitados.end(); itList++){
// distancia tentativa = distancia del inicial al actual + distancia del actual al noVisitado
int dt = distancias[actual] + ady[actual][*itList];
if(distancias[*itList] > dt){


// Agrego a camino el nodo (actual) a travs del cual el nodo inicial se conecta con
*itList
path[*itList] = actual;
}
else if(distancias[*itList] == dt && *itList == final)
caminosPosibles++;

}

// Marco como visitado el nodo actual, la distancia seteada es la mnima.
noVisitados.remove(actual);


// Si no lo pase como parmetro final vale -1, en ese caso el if nunca da true.
if(actual == final) break;


// El nodo actual ahora es el nodo no visitado que tiene la menor distancia al nodo inicial.
int min = INF;
for(itList = noVisitados.begin(); itList != noVisitados.end(); itList++)
if(min >= distancias[*itList]){
min = distancias[*itList];
actual = *itList;
}
}


// Si final vino como parmetro obtengo el camino mnimo y lo guardo en path
if(final != -1){
deque<int> temp;
int nodo = final;

while(nodo != inicial){
temp.push_front(nodo);
nodo = path[nodo];
}

path = temp;

if(ady[inicial][final] != INF)
caminosPosibles++;

cout << "Caminos Posibles " << caminosPosibles << endl;
}
return distancias;
}

You might also like