Sunteți pe pagina 1din 9

ESTRUCTURAS DISCRETAS

PROFESOR: VALVERDE

CICLO: III

ALUMNOS: SUAREZ MALDONADO, Yesenia
RICALDE AROTOMA, Jeniffer
VIACAVA PALOMINO, Fabiola
TORRES GUTIERREZ, Jos
PRETEL LUYA, Luis



AYACUCHO-PERU
2014
ALGORITMO DE DIJKSTRA
El algoritmo de Dijkstra sirve para encontrar el camino de coste mnimo desde un nodo
origen a todos los dems nodos del grafo. Fue diseado por EdsgerWybeDijkstra en
1959El algoritmo de Dijkstra, tambin llamado algoritmo de caminos mnimos, es
un algoritmo para la determinacin del camino ms corto dado un vrtice origen al
resto de vrtices en un grafo con pesos en cada arista. Su nombre se refiere
a EdsgerDijkstra, quien lo describi por primera vez en 1959.
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 coste
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).
EJEMPLO DE ALGORITMO DE DIJKSTRA
El siguiente ejemplo se desarrollar con el fin de encontrar el camino ms corto desde
a hasta z:

Leyenda:
Rojo: Aristas y vrtices pertenecientes a la solucin momentnea.
Azul: Aristas y vrtices candidatos.
PASO 1.

PASO 2.

Ahora, vemos que se aade un nuevo candidato, el vrtice e, y el vrtice c, pero esta
vez a travs del d. Pero el camino mnimo surge al aadir el vrtice c.
Solucin momentnea:
Camino: ADC
Distancia:9
PASO 3.

Solucin momentnea:
Camino: ADCB
Distancia:11
PASO 4.

Como podemos comprobar, se han aadido un candidato nuevo, el vrtice g, a travs
del vrtice b. El mnimo camino hallado en todo el grafo hasta ahora es el siguiente:
Solucin momentnea:
Camino: ADCBF
Distancia:15
PASO 5.

En este antepenltimo paso, se aaden tres vrtices candidatos, los vrtices g, z y e.
Este ltimo ya estaba pero en esta ocasin aparece a travs del vrtice f. En este caso
el camino mnimo, que cambia un poco con respecto al enterior, es:
Solucin momentnea:
Camino: ADCBG
Distancia:17
PASO 6.

En el penltimo paso, vuelve a aparecer otro candidato: el vrtice e, pero esta vez a
travs del vrtice f. De todas formas, el camino mnimo vuelve a cambiar para retomar
el camino que vena siguiendo en los pasos anteriores:
Solucin momentnea:
Camino: ADCBFE
Distancia:18
PASO 7.

Por fin, llegamos al ltimo paso, en el que slo se aade un candidato, el vrtice z a
travs del e. El camino mnimo y final obtenido es nada mas y nada Y menos que:
Solucin Final:
Camino: ADCBFEZ
Distancia:23



Grafos: Algoritmo de Dijkstra
El algoritmo de dijkstra determina la ruta ms corta desde un nodo origen s hacia los
dems nodos, las distancias se almacenan en un vector D. Bsicamente, el algoritmo
toma en la i-sima iteracin al nodo que tiene la menor distancia, Vi, y ve si es posible
disminuir la distancia de sus nodos adyacentes, para hacerlo se verifica si la distancia
hasta Vi ms el costo para ir de i al nodo adyacente, w(i,j), es menor a la distancia
actual en el nodo adyacente.
nt[] Dijkstra(Grafo g, Nodo s)
Construir un arreglo D[] con una celda por cada nodo en g;
Hacer D[s] = 0 donde s es el nodo inicial;
Hacer D[u] = infinito para todos los nodos u excepto el inicial;
Construir una cola de prioridad mnima PQ que contenga cada nodo n, con D[n] como
su prioridad;
while PQ no sea vacia hacer:
Vi = P.removeMinElement();
para cada verticeVj todava en PQ adyacente a Vi hacer:
if D[Vi] + w(Vi, Vj) < D[Vj] entonces:
D[Vj] = D[Vi] + w(Vi, Vj);
Regresar D;
Ejemplo de implementacin
Continuacin se muestra un programa en el que se usa el algoritmo de dijkstra para
calcular la menor distancia desde cada uno de los nodos hacia los dems nodos.
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
#define INF 999
#define MAXN 100
// los nodos en el grafo van de 1 a n
int C[MAXN][MAXN], // matriz de adyacencia, 0 si no estan conectados
// costo para ir de i a j si estan conectados
n, // numero de nodos
e; // numero de aristas
void iniGrafo()
{
for (int i=1; <=n; i++)
memset(&C[i][1], 0, n * sizeof(int));
}
void insertanodo(int a, int b, int c)
{
C[a][b] = C[b][a] = c;
}
int D[MAXN]; /* distancias minima desde s al nodo i */
int padre[MAXN]; /* ruta hacia el nodo i desde s */
int permanente[MAXN]; /* verdadero al tener la menor ruta al nodo i */
void dijkstra(int s)
{
priority_queue<pair<int,int>>pq;
pair<int,int>nodotmp;
int Vi, Vj;

// inicializacion
for (int i=1; i<=n; i++)
D[i] = INF,
padre[i] = -1,
permanente[i] = false;
// inicializacion del nodo inicial
D[s] = 0;
pq.push( pair<int,int> (D[s], s) );
// calculamos las distancias
while( !pq.empty() )
{
nodotmp = pq.top(); pq.pop();
Vi = nodotmp.second;
if ( !permanente[Vi] )
{
permanente[Vi] = true;
for (Vj = 1; Vj<= n; Vj++)
if ( !permanente[Vj] && C[Vi][Vj] > 0 && D[Vi] + C[Vi][Vj] < D[Vj] )
D[Vj] = D[Vi] + C[Vi][Vj],
padre[Vj] = Vi,
pq.push( pair<int,int> (-D[Vj], Vj) );
}
}
}
void imprimeGrafo(int n)
{
for (int i=1; i<=n; i++)
printf("%d(%d) ", i, D[i]);
printf("\n");
}
main()
{
int a, b, c;

// leemos el numero de nodos y aristas
scanf("%d%d", &n, &e);
// inicializamos el grafo
iniGrafo();
// leemos las aristas
for (int i=0; i<e; i++)
scanf("%d%d%d", &a, &b, &c),
insertanodo(a, b, c);
// usamos dijkstra para calcular la menor distancia
// desde el i-esimo nodo hacia los demas
for (int i=1; i<=n; i++)
dijkstra( i ),
printf("La menor distancia desde el nodo %d"
" hacia los otros nodos es:\n", i),
imprimeGrafo( n ),
printf("\n");
Como entrada para el programa anterior se introdujo la siguiente informacin:
5 6
1 2 3
1 3 10
2 4 5
3 4 6
3 5 15
4 5 4
Correspondiente al siguiente grafo:
La salida del programa fue, en la salida el primer nmero es el nodo y el valor entre
parntesis es la distancia:
La menor distancia desde el nodo 1 hacia los otros nodos es:
1(0) 2(3) 3(10) 4(8) 5(12)
La menor distancia desde el nodo 2 hacia los otros nodos es:
1(3) 2(0) 3(11) 4(5) 5(9)
La menor distancia desde el nodo 3 hacia los otros nodos es:
1(10) 2(11) 3(0) 4(6) 5(10)
La menor distancia desde el nodo 4 hacia los otros nodos es:
1(8) 2(5) 3(6) 4(0) 5(4)
La menor distancia desde el nodo 5 hacia los otros nodos es:
1(12) 2(9) 3(10) 4(4) 5(0)

S-ar putea să vă placă și