Menu
Coddy logo textTech

Bellman-Ford-Algorithmus

Zuletzt aktualisiert

Bellman-Ford findet den kürzesten Weg von einem Quellknoten zu jedem anderen Knoten und funktioniert im Gegensatz zu Dijkstra auch, wenn einige Kantengewichte negativ sind. Er arbeitet durch Brute-Force-Relaxierung: Er durchläuft wiederholt jede Kante und aktualisiert die Distanz des Zielknotens, falls der Weg über diese Kante eine kürzere Distanz ergibt. Drücke oben auf Wiedergabe, um zu sehen, wie die vorläufigen Distanzen Durchlauf für Durchlauf sinken.

Nach V - 1 Durchläufen über alle Kanten ist jeder kürzeste Weg (der höchstens V - 1 Kanten haben kann) gefunden. Das macht ihn O(V · E) - langsamer als Dijkstra, aber er verarbeitet negative Gewichte und kann einen negativen Zyklus erkennen (relaxiert ein V-ter Durchlauf noch eine Kante, existiert kein kürzester Weg).

Zeit- und Speicherkomplexität

MaßKomplexitätAnmerkungen
ZeitO(V · E)V − 1 Durchläufe über alle E Kanten
SpeicherO(V)Eine Distanz pro Knoten
Negative GewichteUnterstütztSein entscheidender Vorteil gegenüber Dijkstra
Negative ZyklenErkennbarEin relaxierender V-ter Durchlauf signalisiert einen

Schritt für Schritt

SchrittWas passiert
1Setze die Quelldistanz auf 0 und alle anderen auf unendlich.
2Wiederhole den nächsten Schritt V − 1 Mal.
3Prüfe für jede Kante (u → v, w), ob dist[u] + w < dist[v].
4Falls ja, relaxiere sie: setze dist[v] = dist[u] + w.
5Höre früher auf, wenn ein voller Durchlauf nichts ändert.

Durchgerechnetes Beispiel

Quelle S auf 4 Knoten S, A, B, C mit den Kanten S→A (4), S→B (5), A→C (3), B→A (-3), in dieser Reihenfolge relaxiert. Die Distanzen beginnen bei S=0 und alles andere bei :

DurchlaufDistanzen [S, A, B, C]Aktion
Init[0, ∞, ∞, ∞]Die Quelldistanz ist 0, alle anderen unendlich.
1[0, 2, 5, 7]Relaxiert S→A auf 4, S→B auf 5, A→C auf 7, dann senkt B→A A auf 5 + (-3) = 2.
2[0, 2, 5, 5]A→C verbessert C nun auf 2 + 3 = 5; keine andere Kante relaxiert.
3[0, 2, 5, 5]Keine Kante relaxiert, also sind die Distanzen endgültig: A kostet 2 über S→B→A.

Wann Bellman-Ford verwenden

Verwende ihn, wennVermeide ihn, wenn
Kantengewichte negativ sein können.Alle Gewichte nicht-negativ sind (Dijkstra ist schneller).
Du negative Zyklen erkennen musst.Der Graph riesig und dicht ist - O(V · E) ist zu langsam.
Der Graph klein oder dünn besetzt ist.Du nur eine einzelne Quelle-Ziel-Abfrage auf einem großen Graphen brauchst.
Du eine einfache, leicht umsetzbare Basis brauchst.Die Gewichte nicht-negativ sind und Latenz zählt.

Bellman-Ford Algorithm-Code

Eine saubere, lauffähige Bellman-Ford Algorithm-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Bellman-Ford Algorithm-Code in Python

Python
1def bellman_ford(vertices, edges, start):2    dist = {v: float("inf") for v in vertices}3    dist[start] = 04    # Relax every edge V-1 times5    for _ in range(len(vertices) - 1):6        for u, v, w in edges:7            if dist[u] + w < dist[v]:8                dist[v] = dist[u] + w9    # One more pass: any improvement means a negative cycle10    for u, v, w in edges:11        if dist[u] + w < dist[v]:12            raise ValueError("Graph contains a negative-weight cycle")13    return dist14
15
16vertices = ["A", "B", "C", "D", "E"]17edges = [18    ("A", "B", 6), ("A", "C", 7), ("B", "D", 5), ("B", "E", -4),19    ("C", "D", -3), ("D", "B", -2), ("E", "D", 7),20]21
22for node, d in bellman_ford(vertices, edges, "A").items():23    print(f"A -> {node}: {d}")
Führe diesen Code im Python-Playground aus

Bellman-Ford FAQ

Wie ist die Zeitkomplexität von Bellman-Ford?
Bellman-Ford läuft in O(V · E) Zeit: Er macht V - 1 Durchläufe, und jeder Durchlauf relaxiert alle E Kanten. Das ist langsamer als Dijkstras O((V + E) log V), was der Preis für die Unterstützung negativer Kantengewichte ist.
Wann sollte ich Bellman-Ford statt Dijkstra verwenden?
Verwende Bellman-Ford, wenn der Graph negative Kantengewichte haben kann oder wenn du negative Zyklen erkennen musst. Dijkstra ist schneller, aber nur mit nicht-negativen Gewichten korrekt. Ein häufiger realer Einsatz ist die Erkennung von Devisen-Arbitrage, wo negative Zyklen eine Rolle spielen.
Wie erkennt Bellman-Ford einen negativen Zyklus?
Nach den V - 1 Relaxierungsdurchläufen sind alle kürzesten Wege final, sofern kein negativer Zyklus existiert. Kann ein weiterer Durchlauf noch eine Kante relaxieren, dann ist ein negativer Zyklus erreichbar, und die kürzesten Wege sind undefiniert (man könnte endlos schleifen, um die Kosten zu senken).
Was ist der Unterschied zwischen Bellman-Ford und Floyd-Warshall?
Bellman-Ford berechnet kürzeste Wege von einer einzelnen Quelle in O(V · E), während Floyd-Warshall die kürzesten Wege zwischen allen Paaren in O(V³) berechnet. Auf einem dichten Graphen kostet es O(V² · E), Bellman-Ford von jeder Quelle aus laufen zu lassen, daher ist Floyd-Warshall meist die bessere Wahl, wenn du alle Paare brauchst. Beide verarbeiten negative Kanten und können negative Zyklen anzeigen.
Warum benötigt Bellman-Ford genau V - 1 Durchläufe?
Jeder kürzeste Weg in einem Graphen ohne negativen Zyklus nutzt höchstens V - 1 Kanten, denn ein Weg, der mehr als V Knoten besucht, muss einen wiederholen. Jeder Durchlauf garantiert, dass mindestens eine weitere Kante jedes kürzesten Wegs korrekt relaxiert wird, also reichen V - 1 Durchläufe, um sie alle festzulegen. Ein häufiges Missverständnis ist, dass mehr Durchläufe das Ergebnis verbessern - das tun sie nie, es sei denn, es existiert ein negativer Zyklus.
Kann Bellman-Ford früher stoppen?
Ja. Wenn ein voller Durchlauf über alle Kanten nichts relaxiert, sind alle Distanzen bereits optimal und du kannst vor den V - 1 Durchläufen aufhören. Diese Frühabbruch-Optimierung macht ihn auf schnell konvergierenden Graphen oft deutlich schneller, auch wenn die Worst-Case-Schranke O(V · E) bleibt.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S