Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Kürzeste-Wege-Rechner mit negativen Kanten
Findet kürzeste Pfade und erkennt negative Gewichtszyklen
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Der Bellman-Ford-Algorithmus löst das Kürzeste-Wege-Problem von einer Quelle in Graphen, die negative Kantengewichte enthalten können, was Dijkstra nicht bewältigt. Er erkennt außerdem negative Zyklen, deren Gesamtgewicht unter null liegt und die kürzeste Wege undefiniert machen.
Bellman-Ford relaxiert jede Kante des Graphen V minus 1 Mal, wobei V die Zahl der Knoten ist. Jeder Durchlauf trägt korrekte kürzeste Distanzen einen Schritt weiter, sodass nach V minus 1 Durchläufen alle kürzesten Wege mit höchstens V minus 1 Kanten endgültig sind. Ein letzter Durchlauf prüft, ob sich noch eine Kante relaxieren lässt; falls ja, enthält der Graph einen von der Quelle erreichbaren negativen Zyklus. Die Laufzeit ist O(VE), langsamer als Dijkstra, aber viel allgemeiner.
Bellman-Ford wird in Distanzvektor-Routingprotokollen wie RIP, bei der Erkennung von Währungsarbitrage, wo Wechselkurse zu negativen Log-Gewichten werden, und in jedem Planungsproblem mit möglichen negativen Kosten verwendet. Interviewfragen prüfen oft, ob Kandidaten wissen, wann Dijkstra versagt und Bellman-Ford nötig ist.
Bellman-Ford ist der Kürzeste-Wege-Algorithmus, der Raffinesse gegen Allgemeinheit eintauscht. Es gibt keine Prioritätswarteschlange und keine Reihenfolgeentscheidung, nur wiederholtes Relaxieren aller Kanten.
BellmanFord(graph, quelle):
für jeden Knoten v: dist[v] = unendlich
dist[quelle] = 0
wiederhole V - 1 mal:
geändert = falsch
für jede Kante (u, v, w):
wenn dist[u] + w < dist[v]:
dist[v] = dist[u] + w
vorgänger[v] = u
geändert = wahr
wenn nicht geändert: abbrechen // frühzeitig
// Ein zusätzlicher Durchlauf erkennt negative Zyklen
für jede Kante (u, v, w):
wenn dist[u] + w < dist[v]:
melde erreichbaren negativen ZyklusDie Invariante lautet: Nach Durchlauf i ist jeder kürzeste Weg mit höchstens i Kanten korrekt. Da ein kürzester Weg in einem Graphen ohne negative Zyklen höchstens V - 1 Kanten benutzt, klären V - 1 Durchläufe alles. Verbessert ein V-ter Durchlauf noch etwas, wird ein Weg unbegrenzt kürzer, und genau das bedeutet ein negativer Zyklus.
Führe Bellman-Ford von A aus auf einem Graphen mit einer negativen Kante, die Dijkstra falsch behandeln würde. Die Kanten werden in der angegebenen festen Reihenfolge relaxiert.
Beispielgraph: Gerichtete Kanten A nach B (4), A nach C (5), B nach C (-3) und C nach D (2).
Die korrekten Distanzen sind A 0, B 4, C 1, D 3. Eine einzige negative Kante genügt, um Dijkstra zu brechen, und das ist der Grund, warum es Bellman-Ford gibt.
Zeit: O(VE) · Speicher: O(V)
Der Algorithmus führt V - 1 Durchläufe aus, und jeder Durchlauf relaxiert alle E Kanten einmal, was O(VE) ergibt. Der Speicher besteht aus je einem Distanz- und einem Vorgängereintrag pro Knoten, also O(V) und bemerkenswerterweise unabhängig von E. Bei einem dichten Graphen, in dem E sich V hoch 2 nähert, nähert sich die Laufzeit O(V hoch 3), weshalb Bellman-Ford Fällen vorbehalten bleibt, in denen tatsächlich negative Gewichte auftreten. Die Prüfung auf frühzeitigen Abbruch, die stoppt, sobald ein Durchlauf nichts mehr ändert, endet bei realen Graphen oft nach wenigen Durchläufen, auch wenn der schlechteste Fall bei V - 1 bleibt.
Bellman-Ford ist strikt allgemeiner als Dijkstra und strikt langsamer. Wähle ihn nur, wenn du wirklich brauchst, was er bietet.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Dijkstra-Algorithmus | Alle Kantengewichte sind nichtnegativ. Deutlich schneller und die richtige Voreinstellung. | O((V + E) log V) |
| BFS | Der Graph ist ungewichtet, die Schrittzahl ist also die Distanz. | O(V + E) |
| Floyd-Warshall | Du brauchst alle paarweisen Distanzen statt einer Quelle, und der Graph ist klein oder dicht. | O(V^3) |
| SPFA (Bellman-Ford mit Warteschlange) | Negative Gewichte auf einem dünnen Graphen. In der Praxis viel schneller, der schlechteste Fall bleibt aber O(VE). | O(VE) im schlechtesten Fall |
| Johnson-Algorithmus | Kürzeste Wege zwischen allen Paaren mit negativen Gewichten auf einem dünnen Graphen. Nutzt Bellman-Ford einmal zum Umgewichten, dann Dijkstra von jedem Knoten. | O(V·E + V^2·log V) |
Den ganzen Artikel lesen: Shortest Path Algorithms Explained
Verwandte Algorithmen: Dijkstra-Algorithmus, Floyd-Warshall-Algorithmus, Zykluserkennung