Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Calculadora de caminos con aristas negativas
Calcula caminos mínimos admitiendo pesos negativos y detecta ciclos negativos
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Bellman-Ford resuelve el problema del camino más corto de origen único en grafos que pueden contener pesos de arista negativos, algo que Dijkstra no maneja. También detecta ciclos negativos, ciclos cuyo peso total es inferior a cero, que hacen indefinidos los caminos más cortos.
Bellman-Ford relaja cada arista del grafo V menos 1 veces, donde V es el número de vértices. Cada pasada propaga las distancias más cortas correctas un salto más allá, de modo que tras V menos 1 pasadas todos los caminos más cortos de a lo sumo V menos 1 aristas son definitivos. Una pasada final adicional comprueba si alguna arista aún puede relajarse; si es así, el grafo contiene un ciclo negativo alcanzable desde el origen. El tiempo es O(VE), más lento que Dijkstra pero mucho más general.
Bellman-Ford se usa en protocolos de enrutamiento por vector de distancia como RIP, en la detección de arbitraje de divisas donde los tipos de cambio se vuelven pesos logarítmicos negativos, y en cualquier problema de planificación con costes negativos. Las preguntas de entrevista suelen comprobar si los candidatos saben cuándo falla Dijkstra y se requiere Bellman-Ford.
Bellman-Ford es el algoritmo de caminos mínimos que renuncia a la astucia a cambio de generalidad. No hay cola de prioridad ni decisión de orden, solo relajación repetida de todas las aristas.
BellmanFord(grafo, origen):
para cada vértice v: dist[v] = infinito
dist[origen] = 0
repetir V - 1 veces:
cambió = falso
para cada arista (u, v, w):
si dist[u] + w < dist[v]:
dist[v] = dist[u] + w
padre[v] = u
cambió = verdadero
si no cambió: salir // salida anticipada
// Una pasada extra detecta ciclos negativos
para cada arista (u, v, w):
si dist[u] + w < dist[v]:
informar de ciclo negativo alcanzableEl invariante es que tras la pasada i, todo camino mínimo que use como mucho i aristas ya es correcto. Como un camino mínimo en un grafo sin ciclos negativos usa a lo sumo V - 1 aristas, V - 1 pasadas lo resuelven todo. Si una pasada V-ésima aún mejora algo, es que un camino se acorta sin límite, que es exactamente lo que significa un ciclo negativo.
Ejecuta Bellman-Ford desde A sobre un grafo con una arista negativa que Dijkstra resolvería mal. Las aristas se relajan en el orden fijo que se indica.
Grafo de ejemplo: Aristas dirigidas A a B (4), A a C (5), B a C (-3) y C a D (2).
Las distancias correctas son A 0, B 4, C 1, D 3. Una sola arista negativa basta para romper Dijkstra, y esa es la razón de que exista Bellman-Ford.
Tiempo: O(VE) · Espacio: O(V)
El algoritmo realiza V - 1 pasadas y cada pasada relaja las E aristas una vez, lo que da O(VE). El espacio es una distancia y un padre por vértice, es decir O(V), llamativamente independiente de E. En un grafo denso donde E se acerca a V al cuadrado, el tiempo se aproxima a O(V al cubo), y por eso Bellman-Ford se reserva para casos donde realmente hay pesos negativos. La comprobación de salida anticipada, que detiene el proceso en cuanto una pasada no cambia nada, suele terminar en unas pocas pasadas sobre grafos reales aunque el peor caso siga siendo V - 1.
Bellman-Ford es estrictamente más general que Dijkstra y estrictamente más lento. Elígelo solo cuando necesites de verdad lo que aporta.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Algoritmo de Dijkstra | Todos los pesos son no negativos. Bastante más rápido y la opción correcta por defecto. | O((V + E) log V) |
| BFS | El grafo no tiene pesos, así que el número de saltos es la distancia. | O(V + E) |
| Floyd-Warshall | Necesitas distancias entre todos los pares y no solo desde un origen, y el grafo es pequeño o denso. | O(V^3) |
| SPFA (Bellman-Ford con cola) | Pesos negativos en un grafo disperso. Mucho más rápido en la práctica, aunque el peor caso sigue siendo O(VE). | O(VE) en el peor caso |
| Algoritmo de Johnson | Caminos mínimos entre todos los pares con pesos negativos en un grafo disperso. Usa Bellman-Ford una vez para repesar y luego Dijkstra desde cada nodo. | O(V·E + V^2·log V) |
Leer el artículo completo: Shortest Path Algorithms Explained
Algoritmos relacionados: Algoritmo de Dijkstra, Algoritmo de Floyd-Warshall, Detección de Ciclos