Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Calculadora de caminos entre todos los pares
Calcula los caminos mínimos entre todos los pares de vértices en una sola ejecución
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Floyd-Warshall calcula los caminos más cortos entre todos los pares de vértices de un grafo ponderado en una sola ejecución. Es un ejemplo clásico de programación dinámica sobre grafos y admite pesos de arista negativos siempre que no haya ciclos negativos.
El algoritmo itera sobre cada vértice k y pregunta, para cada par (i, j), si el camino de i a j mejora al pasar por k. La actualización dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) se aplica a todos los pares, ampliando de uno en uno el conjunto de vértices intermedios permitidos. Tres bucles anidados sobre los vértices dan O(V al cubo) tiempo y O(V al cuadrado) espacio, práctico para grafos densos de hasta unos pocos miles de nodos.
Floyd-Warshall responde consultas de distancia entre todos los pares en la planificación de rutas, calcula la clausura transitiva de relaciones, halla diámetros de grafos y admite la detección de arbitraje entre todos los pares de divisas a la vez. Es un tema de entrevista favorito para poner a prueba la intuición de programación dinámica sobre grafos.
Tres bucles anidados y una sola línea de actualización. Toda la sutileza está en el orden de los bucles: k debe ser el bucle más externo, y equivocarse en eso es el fallo clásico.
FloydWarshall(grafo):
dist = matriz V por V, todo infinito
para cada vértice v: dist[v][v] = 0
para cada arista (u,v,w): dist[u][v] = w
para k en vértices: // intermedio
para i en vértices: // origen
para j en vértices: // destino
si dist[i][k] + dist[k][j] < dist[i][j]:
dist[i][j] = dist[i][k] + dist[k][j]
sig[i][j] = sig[i][k] // reconstrucción
// Hay ciclo negativo si dist[v][v] < 0 para algún vEl invariante es que, tras la iteración para k, dist[i][j] es el camino más corto de i a j usando solo vértices de los k primeros como intermedios. k tiene que ser el más externo para que eso se cumpla: es lo que amplía de uno en uno el conjunto de escalas permitidas. Poner k en el bucle interno termina igualmente y produce números plausibles, que es justo lo que hace tan difícil de detectar el fallo.
Ejecuta Floyd-Warshall sobre un pequeño grafo dirigido y observa cómo una entrada mejora dos veces conforme crece el conjunto de intermedios permitidos.
Grafo de ejemplo: Aristas dirigidas A a B (3), A a C (8), B a C (2), B a D (7) y C a D (1).
Las distancias finales desde A son B 3, C 5, D 6. La entrada A a D mejoró dos veces, de infinito a 10 y luego a 6, lo que muestra la estratificación de forma directa: la pasada k = C solo pudo encontrar la ruta mejor porque la pasada k = B ya había mejorado A a C. Esa dependencia es la razón de que k deba ser el bucle externo.
Tiempo: O(V^3) · Espacio: O(V^2)
Tres bucles anidados sobre todos los vértices dan exactamente V al cubo iteraciones, cada una con trabajo constante. No hay salida anticipada ni dependencia del número de aristas, así que el algoritmo cuesta lo mismo en un grafo disperso que en uno denso. El espacio es la matriz V por V de distancias, más una segunda matriz si quieres reconstruir los caminos y no solo sus longitudes. En la práctica V al cubo es aceptable hasta unos pocos miles de vértices; con 5.000 son 125.000 millones de operaciones, y ejecutar Dijkstra desde cada vértice, en O(V·E·log V), pasa a ser mejor opción en grafos dispersos.
Floyd-Warshall gana en densidad y simplicidad, y pierde con claridad en grafos dispersos grandes.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Dijkstra desde cada vértice | Grafo disperso, sin pesos negativos. Mucho más rápido cuando E queda muy por debajo de V al cuadrado. | O(V·E·log V) |
| Algoritmo de Johnson | Grafo disperso con pesos negativos. Repesa con Bellman-Ford y luego ejecuta Dijkstra desde cada vértice. | O(V·E + V^2·log V) |
| BFS desde cada vértice | El grafo no tiene pesos y solo necesitas el número de saltos entre todos los pares. | O(V·(V + E)) |
| Clausura transitiva | Solo necesitas alcanzabilidad, no distancia. El mismo triple bucle con OR booleano, que es el algoritmo original de Warshall. | O(V^3) |
Leer el artículo completo: Shortest Path Algorithms Explained
Algoritmos relacionados: Algoritmo de Dijkstra, Algoritmo de Bellman-Ford