🗺️ Floyd-Warshall — Caminos Más Cortos Entre Todos los Pares
Floyd-Warshall encuentra los caminos más cortos entre cada par de vértices en O(V³) relajando a través de cada nodo intermedio. Observa cómo la matriz de distancias se ajusta a medida que avanza el pivote k.
Acerca de esta simulación
Esta simulación ejecuta el algoritmo de Floyd-Warshall en vivo sobre un pequeño grafo dirigido aleatorio con entre 5 y 7 vértices. Rellena una matriz de distancias V×V relajando cada par (i, j) a través de un vértice pivote k, un paso del triple bucle a la vez, y hace parpadear cada celda en el momento en que mejora. Una vez que el pivote ha recorrido todos los vértices, el camino más corto entre el origen y el destino elegidos se resalta directamente en el grafo, reconstruido a partir de una matriz de siguiente salto construida junto con las distancias.
🔬 Qué muestra
Un grafo dirigido ponderado (un anillo conectado más un puñado de aristas aleatorias adicionales) representado como flechas con sus pesos, junto a una matriz de distancias V×V en vivo. A medida que avanza el pivote k, se resaltan la fila y la columna de k, cualquier celda que se relaja parpadea, y una vez que la ejecución termina, las aristas del camino más corto entre origen y destino se vuelven moradas mientras el indicador de distancia muestra el total final.
🎮 Cómo usarlo
Ajusta el número de Vértices (5-7) y la Velocidad, luego pulsa Reproducir para animar el triple bucle automáticamente o Paso para avanzar exactamente un pivote k a la vez. Elige un Origen y un Destino en los menús desplegables para decidir de qué par se traza el camino más corto una vez que el algoritmo termina, y usa Regenerar para obtener un nuevo grafo aleatorio. El panel de registro lista cada relajación a medida que ocurre, en la forma k=X: A→B = nueva distancia.
💡 ¿Sabías que…?
Floyd-Warshall no necesita cola de prioridad ni reinicio por cada origen: tres simples bucles anidados sobre cada vértice resuelven todos los pares a la vez. Ese coste plano O(V³) con un factor constante diminuto es la razón por la que suele ser la opción práctica en grafos pequeños o densos, aunque existan enfoques asintóticamente más inteligentes para grafos grandes y dispersos.
Preguntas frecuentes
¿Qué controlan realmente los deslizadores de Vértices y Velocidad?
El deslizador de Vértices (de 5 a 7) establece cuántos nodos tiene el grafo aleatorio, lo que también determina el tamaño de la matriz de distancias y cuántos pivotes recorre el algoritmo. Velocidad (de 0,2 a 4) controla la rapidez con la que Reproducir avanza automáticamente por los pasos de relajación; no tiene efecto cuando se usa Paso, que siempre avanza exactamente las relajaciones de un pivote por clic.
¿Qué ocurre al pulsar Reproducir frente a Paso?
Reproducir ejecuta el algoritmo de forma continua a la Velocidad elegida, avanzando i, j y finalmente el pivote k hasta que se han procesado todos los pivotes y la ejecución se marca como Completada. Paso, en cambio, avanza un pivote k completo en un solo clic, aplicando todas sus relajaciones (i, j) a la vez, lo cual es útil para pausar e inspeccionar la matriz entre pivotes.
¿Cómo se elige y dibuja el camino más corto resaltado?
Eliges los vértices de Origen y Destino en los selectores desplegables. Una vez finalizada la ejecución, la simulación reconstruye el camino siguiendo la matriz de siguiente salto desde el origen hasta llegar al destino, y dibuja cada arista de esa ruta en morado sobre el grafo, mientras que el dato de distancia del camino muestra el peso total, o el símbolo de infinito si no existe ningún camino.
¿Por qué algunas celdas de la matriz de distancias muestran el símbolo de infinito?
Un símbolo de infinito significa que aún no se ha encontrado ningún camino entre esa fila y esa columna. La diagonal siempre empieza en 0 porque cada vértice se alcanza a sí mismo con coste cero. A medida que el pivote k avanza en las relajaciones del panel de registro, las entradas de infinito se convierten en números finitos cuando k resulta ser un paso intermedio útil entre dos vértices que no estaban directamente conectados.
¿Por qué el grafo se regenera con aristas distintas cada vez?
Regenerar construye un nuevo grafo dirigido aleatorio: un anillo conectado para que cada vértice pueda alcanzar al siguiente, más un puñado de aristas aleatorias adicionales con pesos de 1 a 9, de modo que la forma del problema cambia en cada ejecución. Cambiar el deslizador de Vértices también desencadena una regeneración completa, ya que el tamaño de la matriz y la longitud del anillo dependen del número de vértices.
Preguntas frecuentes
¿Qué calcula el algoritmo de Floyd-Warshall?
Floyd-Warshall calcula el camino más corto entre cada par de vértices de un grafo ponderado a la vez. En lugar de ejecutar un algoritmo de fuente única desde cada nodo, rellena una matriz V×V donde dist[i][j] es la longitud del camino más corto de i a j. Funciona en grafos dirigidos o no dirigidos y admite pesos de arista negativos siempre que no haya un ciclo negativo.
¿Cómo funciona la relajación mediante el pivote?
El algoritmo utiliza un triple bucle con un pivote externo k. Para cada par (i, j) comprueba si ir de i a k y luego de k a j es más corto que la mejor opción actual: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]). Una vez que el pivote ha recorrido todos los vértices, se han encontrado todos los caminos más cortos que usan únicamente vértices intermedios del conjunto completo.
¿Por qué Floyd-Warshall es O(V³)?
Hay tres bucles anidados, cada uno recorriendo todos los V vértices: el pivote k, el origen i y el destino j. Eso da V × V × V = V³ pasos de relajación, por lo que la complejidad temporal es O(V³). La complejidad espacial es O(V²) para la matriz de distancias, más otro O(V²) si se mantiene una matriz de predecesores para reconstruir el camino.
¿Por qué es correcto el orden de programación dinámica?
Tras la iteración k, dist[i][j] contiene el camino más corto de i a j que solo puede pasar por vértices intermedios numerados de 1 a k. Como el pivote k es el bucle más externo, cuando usamos dist[i][k] y dist[k][j] ya tienen en cuenta todos los pivotes anteriores, de modo que la recurrencia siempre se construye sobre subsoluciones óptimas. Este es el invariante clásico de programación dinámica que hace correcto al algoritmo.
¿Cómo maneja Floyd-Warshall las aristas negativas y los ciclos negativos?
A diferencia de Dijkstra, Floyd-Warshall tolera pesos de arista negativos y sigue devolviendo caminos más cortos correctos. Un ciclo negativo, sin embargo, significa que algunos caminos más cortos quedan indefinidos porque se puede dar vueltas indefinidamente para reducir el coste. Se puede detectar un ciclo negativo después de la ejecución: si alguna entrada diagonal dist[i][i] se vuelve negativa, el vértice i está en un ciclo negativo. Esta simulación usa únicamente pesos no negativos para mantener los resultados bien definidos.
¿Cómo se reconstruye el camino más corto?
Durante la inicialización, una matriz de siguiente salto next[i][j] se fija a j siempre que exista una arista directa. Cada vez que una relajación a través del pivote k mejora dist[i][j], copiamos next[i][j] = next[i][k], registrando que la mejor ruta ahora comienza dirigiéndose hacia k. Para reconstruir el camino se sigue next[i][j] desde el origen hasta llegar al destino, recopilando los vértices por el camino.
¿Cómo se compara Floyd-Warshall con Dijkstra?
Dijkstra resuelve el problema del camino más corto de fuente única y es rápido en grafos dispersos, pero requiere pesos no negativos y solo da caminos desde un único origen. Ejecutar Dijkstra desde cada vértice cuesta aproximadamente O(V·E·log V) con un montículo, lo que supera a Floyd-Warshall en grafos dispersos grandes. Floyd-Warshall, con su coste plano O(V³) y factores constantes pequeños, es más sencillo de programar y a menudo gana en grafos pequeños o densos y cuando realmente se necesitan todos los pares.
¿Cómo se compara con Bellman-Ford?
Bellman-Ford también es de fuente única pero, al igual que Floyd-Warshall, acepta aristas negativas y puede detectar ciclos negativos. Se ejecuta en O(V·E) por origen. Si necesitas caminos más cortos desde un único origen en un grafo con aristas negativas, Bellman-Ford es la opción natural; si necesitas todos los pares a la vez, los tres bucles compactos de Floyd-Warshall suelen ser más fáciles y competitivos en grafos densos.
¿Qué significa ∞ (INF) en la matriz de distancias?
Una entrada de ∞ significa que actualmente no se conoce ningún camino entre esos dos vértices. La diagonal dist[i][i] empieza en 0 porque la distancia de un vértice a sí mismo es cero. A medida que avanza el pivote, las entradas ∞ pueden volverse finitas cuando un vértice intermedio conecta dos nodos previamente desconectados, que es exactamente el 'ajuste' de la matriz que se ve en la animación.
¿Dónde se usa Floyd-Warshall en la práctica?
Se utiliza para tablas de enrutamiento en redes pequeñas, calcular el cierre transitivo de una relación, encontrar el diámetro y la centralidad de un grafo, y resolver consultas de distancia entre todos los pares en mapas, juegos e investigación operativa. Una variante booleana calcula alcanzabilidad, y una variante max-min resuelve problemas de camino más ancho o de cuello de botella intercambiando las operaciones min/suma por max/min.
Floyd-Warshall encuentra los caminos más cortos entre cada par de vértices en O(V³) relajando a través de cada nodo. Observa cómo la matriz se ajusta a medida que avanza el pivote k.
3D · Motor de renderizado Three.js / WebGL · Objetivo de 60 FPS · funciona totalmente del lado del cliente, sin instalación