Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Calculadora interactiva de camino más corto
Halla los caminos mínimos desde un origen en grafos con pesos no negativos
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Dijkstra calcula el camino más corto desde un nodo origen a todos los demás nodos en un grafo ponderado con pesos de arista no negativos. Publicado por Edsger Dijkstra en 1959, sigue siendo el algoritmo estándar de camino más corto de origen único y la base de la mayoría de los sistemas de enrutamiento prácticos.
El algoritmo mantiene una distancia tentativa para cada nodo, inicialmente infinita salvo el origen en cero. Con una cola de prioridad extrae repetidamente el nodo pendiente con la menor distancia tentativa, lo marca como definitivo y relaja cada arista saliente: si el camino a través del nodo actual es más corto que la distancia registrada del vecino, esta se actualiza. Con un montículo binario se ejecuta en O((V + E) log V). Los pesos no negativos son esenciales; una arista negativa puede invalidar nodos ya definitivos.
El algoritmo de Dijkstra impulsa la navegación GPS, protocolos de enrutamiento de internet como OSPF, planificadores de vuelos y transporte, y el análisis de latencia de red. También aparece en juegos para la búsqueda de rutas cuando no hay heurísticas. En entrevistas es la respuesta canónica para preguntas de camino más corto ponderado y el punto de partida para A* y Bellman-Ford.
Dijkstra es un algoritmo voraz cuya corrección se apoya en una sola afirmación: el nodo pendiente más cercano ya no puede mejorarse después. Una cola de prioridad entrega ese nodo en O(log V).
Dijkstra(grafo, origen):
para cada vértice v: dist[v] = infinito
dist[origen] = 0
cp = cola de prioridad con (0, origen)
mientras cp no esté vacía:
(d, u) = cp.extraerMínimo()
si d > dist[u]: continuar // entrada obsoleta
para cada arista (u, v, w):
si dist[u] + w < dist[v]:
dist[v] = dist[u] + w
padre[v] = u
cp.insertar((dist[v], v))La comprobación de entradas obsoletas importa. En lugar de reducir la clave dentro del montículo, algo que la mayoría de bibliotecas estándar no permite, lo habitual es insertar una entrada duplicada e ignorar cualquiera cuya distancia registrada ya no coincida. Esto se llama borrado perezoso, y es la razón de que la cola pueda contener hasta E entradas en lugar de V.
Ejecuta Dijkstra desde A sobre un grafo con pesos donde la elección voraz da resultado, observando cómo crece el conjunto de nodos fijados.
Grafo de ejemplo: Aristas no dirigidas A-B (4), A-C (2), C-B (1), B-D (5) y C-D (8).
Las distancias finales son A 0, C 2, B 3, D 8, y el camino mínimo hasta D pasa por A, C, B y D. Fíjate en que la arista directa A-B de peso 4 nunca se usa: llegar por C cuesta 3. Fíjate también en que los nodos se fijan en orden de distancia 0, 2, 3, 8, que es exactamente la propiedad en la que se apoya el argumento voraz.
Tiempo: O((V + E) log V) · Espacio: O(V)
Con un montículo binario, cada uno de los V vértices se extrae una vez a O(log V), y cada una de las E aristas puede provocar una inserción a O(log V), lo que da O((V + E) log V). Con borrado perezoso el montículo contiene hasta E entradas, así que la extracción es O(log E), pero como E es a lo sumo V al cuadrado, log E es como mucho 2 log V y la cota no cambia. Un montículo de Fibonacci mejora la cota teórica a O(E + V log V) porque reducir clave pasa a ser O(1) amortizado, aunque las constantes son lo bastante malas como para que en la práctica suelan ganar los montículos binarios. En un grafo denso, un simple recorrido de un vector para hallar el mínimo da O(V al cuadrado), que supera al montículo cuando E se acerca a V al cuadrado.
Dijkstra es la opción por defecto para caminos mínimos con pesos. Lo que lo sustituye depende de cuál de sus supuestos rompa tu grafo.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| BFS | Todas las aristas tienen el mismo peso, así que el número de saltos es la distancia. Estrictamente más rápido. | O(V + E) |
| Bellman-Ford | Algún peso es negativo, lo que rompe el argumento voraz de fijación. | O(VE) |
| Búsqueda A* | Quieres un destino concreto y dispones de una heurística admisible, como la distancia en línea recta en un mapa. | O((V + E) log V) en el peor caso |
| Floyd-Warshall | Necesitas todas las distancias entre pares y el grafo es pequeño o denso. | O(V^3) |
| Dijkstra bidireccional | Un origen, un destino, un grafo grande y aristas que puedes recorrer hacia atrás. | aproximadamente la mitad de nodos explorados |
Leer el artículo completo: Dijkstra's Algorithm Explained Step by Step
Leer el artículo completo: Shortest Path Algorithms Explained
Algoritmos relacionados: Algoritmo de Bellman-Ford, Algoritmo de Floyd-Warshall, Búsqueda en Anchura