Vous êtes sur la page 1sur 4

Algoritmo de Dijkstra

El 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
Algoritmo de Dijkstra
los vrtices en un grafo con pesos en cada arista. Su
nombre se refiere a Edsger Dijkstra, 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 Ejecucin del algoritmo de Dijkstra
excluidos de la bsqueda nodos que en prximas Tipo Algoritmo de bsqueda
iteraciones bajaran el costo general del camino al pasar Problema que Problema del camino ms
por una arista con costo negativo). resuelve corto

Una de sus aplicaciones ms importantes reside en el Estructura de datos Grafo


campo de la telemtica, gracias a l, podemos resolver Creador Edsger Dijkstra
grafos con muchos nodos, los cuales seran muy Fecha 1959
complicados de hacer sin dicho algoritmo, encontrando
Clase de complejidad P
as las rutas ms cortas entre un origen y todos los
destinos en una red. Tiempo de ejecucin
Peor caso
[editar datos en Wikidata]

ndice
1 Algoritmo
2 Complejidad
3 Pseudocdigo
4 Otra versin en pseudocdigo sin cola de
prioridad
5 Otra versin en C del Algoritmo de Dijkstra
6 Vase tambin
7 Enlaces externos

Algoritmo
Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo inicial, un vector D de tamao N
guardar al final del algoritmo las distancias desde x al resto de los nodos.

1. Inicializar todas las distancias en D con un valor infinito relativo ya que son desconocidas al principio,
exceptuando la de x que se debe colocar en 0 debido a que la distancia de x a x sera 0.
2. Sea a = x (tomamos a como nodo actual).
3. Recorremos todos los nodos adyacentes de a, excepto los nodos marcados, llamaremos a estos nodos no
marcados vi.
4. Para el nodo actual, calculamos la distancia tentativa desde dicho nodo a sus vecinos con la siguiente
frmula: dt(vi) = Da + d(a,vi). Es decir, la distancia tentativa del nodo vi es la distancia que actualmente
tiene el nodo en el vector D ms la distancia desde dicho el nodo a (el actual) al nodo vi. Si la distancia
tentativa es menor que la distancia almacenada en el vector, actualizamos el vector con esta distancia
tentativa. Es decir: Si dt(vi) < Dvi Dvi = dt(vi)
5. Marcamos como completo el nodo a.
6. Tomamos como prximo nodo actual el de menor valor en D (puede hacerse almacenando los valores en
una cola de prioridad) y volvemos al paso 3 mientras existan nodos no marcados.

Una vez terminado al algoritmo, D estar completamente lleno.

Complejidad
Orden de complejidad del algoritmo: O(|V|2+|A|) = O(|V|2) sin utilizar cola de prioridad, O((|A|+|V|) log |V|) =
O(|A| log |V|) utilizando cola de prioridad (por ejemplo un montculo). Por otro lado, si se utiliza un Montculo
de Fibonacci, sera O(|V| log |V|+|A|).

La la complejidad computacional del algoritmo de Dijkstra se puede calcular contando las operaciones
realizadas:

El algoritmo consiste en n-1 iteraciones como mximo. En cada iteracin se aade un vrtice al conjunto
distinguido.
En cada iteracin se identifica el vrtice con la menor etiqueta entre los que no estn en Sk. El nmero de
estas operaciones est acotado por n-1.
Adems se realizan una suma y una comparacin para actualizar la etiqueta de cada uno de los vrtices
que no estn en Sk.

Luego, en cada iteracin se realizan a lo sumo 2(n-1) operaciones. Entonces tenemos: TEOREMA: El
Algoritmo de Dijkstra realiza O(n2) 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.

Pseudocdigo
Estructura de datos auxiliar: Q = Estructura de datos Cola de prioridad (se puede implementar con un
montculo)

DIJKSTRA (Grafo G, nodo_fuente s)


para u V[G] hacer
distancia[ u] = INFINITO
padre[ u] = NULL
visto[ u] = false
distancia[ s] = 0
adicionar (cola, (s, distancia[ s]))
mientras que cola no es vaca hacer
u = extraer_mnimo(cola)
visto[ u] = true
para todos v adyacencia[ u] hacer
si no visto[ v] y distancia[ v] > distancia[ u] + peso ( u, v) hacer
distancia[ v] = distancia[ u] + peso ( u, v)
padre[ v] = u
adicionar(cola,( v, distancia[ v]))

Otra versin en pseudocdigo sin cola de prioridad


funcin Dijkstra (Grafo G, nodo_salida s)
//Usaremos un vector para guardar las distancias del nodo salida al resto
entero distancia[n]
//Inicializamos el vector con distancias iniciales
booleano visto[n]
//vector de boleanos para controlar los vrtices de los que ya tenemos la distancia mnima
para cada w V[G] hacer
Si (no existe arista entre s y w) entonces
distancia[w] = Infinito //puedes marcar la casilla con un -1 por ejemplo
Si_no
distancia[w] = peso (s, w)
fin si
fin para
distancia[s] = 0
visto[s] = cierto
//n es el nmero de vrtices que tiene el Grafo
mientras que (no_estn_vistos_todos) hacer
vrtice = tomar_el_mnimo_del_vector distancia y que no est visto;
visto[vrtice] = cierto;
para cada w sucesores (G, vrtice) hacer
si distancia[w]>distancia[vrtice]+peso (vrtice, w) entonces
distancia[w] = distancia[vrtice]+peso (vrtice, w)
fin si
fin para
fin mientras
fin funcin .

Al final tenemos en el vector distancia en cada posicin la distancia mnima del vrtice salida a otro vrtice
cualquiera.

Otra versin en C del Algoritmo de Dijkstra


#define MAX_NODES 1024 /* nmero mximo de nodos */
#define INFINITY 1000000000 /* un nmero mayor que cualquier ruta mxima */
int n, dist[MAX_NODES ][MAX_NODES ]; /* dist[i][j] es la distancia de i a j */

void shortest_path (int s, int t, int path[])


{
struct state { /* la ruta en la que se est trabajando */
int predecessor ; /* nodo previo */
int length ; /* longitud del origen a este nodo */
enum {permanent , tentative } label; /* estado de la etiqueta */
} state[MAX_NODES ];
struct state *p;
int i, k, min;
for (p = &state[0]; p < &state[n]; p++) { /* estado de inicializacin*/
p->predecessor = -1;
p->length = INFINITY ;
p->label = tentative ;
}
state[t].length = 0; state[t].label = permanent ;
k = t; /* k es el nodo de trabajo inicial */
do{ /* hay una ruta mejor desde k? */
for (i = 0; i < n; i++) /* este grafo tiene n nodos */
if (dist[k][i] != 0 && state[i].label == tentative ) {
if (state[k].length + dist[k][i] < state[i].length ) {
state[i].predecessor = k;
state[i].length = state[k].length + dist[k][i];
}
}
/* Encuentra el nodo etiquetado tentativamente con la etiqueta menor. */
k = 0; min = INFINITY ;
for (i = 0; i < n; i++)
if (state[i].label == tentative && state[i].length < min) {
min = state[i].length ;
k = i;
}
state[k].label = permanent ;
} while (k != s);
/* Copia la ruta en el arreglo de salida. */
i = 0; k = s;
do {path[i++] = k; k = state[k].predecessor ; } while (k >= 0);
}

Vase tambin
Anexo:Ejemplo de Algoritmo de Dijkstra
Algoritmo de Bellman-Ford

Enlaces externos
Wikimedia Commons alberga contenido multimedia sobre Algoritmo de Dijkstra.
Presentacin del Algoritmo de Dijkstra
Video del Algoritmo de Dijkstra
Applets en Java para probar el algoritmo de Dijkstra (Ingls)
Graph mdulo Perl en CPAN
Bio::Coordinate::Graph mdulo Perl en CPAN que implementa el algoritmo de Dijkstra
Algoritmo de Dijkstra en Javascript Resolucin online del Algoritmo de Dijkstra.
Optimizacin del algoritmo del camino ms corto entre todos los nodos de un grafo no dirigido
Comparacin entre el algoritmo de Dijkstra y el de Floyd-Warshall, y mtodo para optimizar el primero
Distintas implementaciones del algoritmo en RosettaCode.org

Obtenido de https://es.wikipedia.org/w/index.php?title=Algoritmo_de_Dijkstra&oldid=101162339

Se edit esta pgina por ltima vez el 15 ago 2017 a las 16:55.
El texto est disponible bajo la Licencia Creative Commons Atribucin Compartir Igual 3.0; pueden
aplicarse clusulas adicionales. Al usar este sitio, usted acepta nuestros trminos de uso y nuestra poltica
de privacidad.
Wikipedia es una marca registrada de la Fundacin Wikimedia, Inc., una organizacin sin nimo de
lucro.

Vous aimerez peut-être aussi