Logik
- kürzesten Weg von einem Startknoten zu allen anderen Knoten finden
- funktioniert auch mit negativem Gewicht
Vorgehen
- Den Startknoten auf Distanz 0 setzen, alle anderen Knoten auf unendlich ()
- Man geht jede einzelne Kante (Verbindung) im gesamten Graphen einmal durch (die Reihenfolge ist egal) und prüft für jede Kante (von nach ):
- Kenne ich schon einen Weg zu (Distanz nicht unendlich)
- Ja? Ist der Weg über nach kürzer als der Weg, den ich bisher für kannte?
- Ja? Aktualisiere die Distanz zu mit dem neuen, besseren Wert.
- Ja? Ist der Weg über nach kürzer als der Weg, den ich bisher für kannte?
- Kenne ich schon einen Weg zu (Distanz nicht unendlich)
- Diese komplette “Runde” (alle Kanten prüfen) genau Mal durchführen
- Negativen Zyklus erkennen: Genau eine weitere Runde durchführen, wenn ein Weg verkürzt werden kann, gibt es einen negativen Zyklus
Invariante
Nach i Iterationen ist minimal für alle v ∈ V die einen kürzesten s-v Pfad haben mit maximal i Kanten.
Pseudocode
Laufzeit:
BellmanFord(E, c, s)
d[1...n] = {inf, ..., inf}
d[s] = 0
for i = 1, ..., n-1:
for (u, v) in E:
d[v] = min(d[v], d[u] + c(u, v))
// Letzte Iteration überprüft auf negative Zyklen
for (u, v) in E:
if d[u] + c(u, v) < d[v]:
return "negative Cycle"
return d