Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Rechner für kürzeste Wege aller Paare
Findet kürzeste Pfade zwischen allen Knotenpaaren
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Der Floyd-Warshall-Algorithmus berechnet in einem einzigen Lauf die kürzesten Wege zwischen allen Knotenpaaren eines gewichteten Graphen. Er ist ein klassisches Beispiel für dynamische Programmierung auf Graphen und verkraftet negative Kantengewichte, solange keine negativen Zyklen vorliegen.
Der Algorithmus iteriert über jeden Knoten k und fragt für jedes Paar (i, j), ob sich der Weg von i nach j verbessert, wenn er über k führt. Die Aktualisierung dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) wird für alle Paare angewendet und erweitert die Menge erlaubter Zwischenknoten schrittweise. Drei geschachtelte Schleifen über die Knoten ergeben O(V hoch 3) Zeit und O(V hoch 2) Speicher, praktikabel für dichte Graphen bis zu einigen tausend Knoten.
Floyd-Warshall beantwortet Distanzabfragen für alle Paare in der Routenplanung, berechnet die transitive Hülle von Relationen, findet Graphdurchmesser und unterstützt die Arbitrage-Erkennung über alle Währungspaare zugleich. Es ist ein beliebtes Interviewthema, um die Intuition für dynamische Programmierung auf Graphen zu prüfen.
Drei geschachtelte Schleifen und eine einzige Aktualisierungszeile. Die ganze Feinheit steckt in der Schleifenreihenfolge: k muss die äußerste Schleife sein, und das falsch zu machen ist der klassische Fehler.
FloydWarshall(graph):
dist = V mal V Matrix, alles unendlich
für jeden Knoten v: dist[v][v] = 0
für jede Kante (u,v,w): dist[u][v] = w
für k in Knoten: // Zwischenknoten
für i in Knoten: // Quelle
für j in Knoten: // Ziel
wenn dist[i][k] + dist[k][j] < dist[i][j]:
dist[i][j] = dist[i][k] + dist[k][j]
next[i][j] = next[i][k] // Rekonstruktion
// Negativer Zyklus genau dann, wenn dist[v][v] < 0Die Invariante lautet: Nach dem Durchlauf für k ist dist[i][j] der kürzeste Weg von i nach j, der nur die ersten k Knoten als Zwischenstationen benutzt. Damit das gilt, muss k außen stehen: genau das erweitert die Menge erlaubter Zwischenstationen Schritt für Schritt. Steht k innen, terminiert der Algorithmus trotzdem und liefert plausible Zahlen, und genau das macht den Fehler so schwer auffindbar.
Führe Floyd-Warshall auf einem kleinen gerichteten Graphen aus und beobachte, wie sich ein Eintrag zweimal verbessert, während die Menge der erlaubten Zwischenknoten wächst.
Beispielgraph: Gerichtete Kanten A nach B (3), A nach C (8), B nach C (2), B nach D (7) und C nach D (1).
Die Enddistanzen von A aus sind B 3, C 5, D 6. Der Eintrag A nach D verbesserte sich zweimal, von unendlich auf 10 und dann auf 6, was die Schichtung unmittelbar zeigt: der Durchlauf k = C konnte die bessere Route nur finden, weil der Durchlauf k = B bereits A nach C verbessert hatte. Diese Abhängigkeit ist der Grund, warum k die äußere Schleife sein muss.
Zeit: O(V^3) · Speicher: O(V^2)
Drei geschachtelte Schleifen über alle Knoten ergeben exakt V hoch 3 Iterationen mit jeweils konstantem Aufwand. Es gibt weder frühzeitigen Abbruch noch eine Abhängigkeit von der Kantenzahl, der Algorithmus kostet auf einem dünnen Graphen also dasselbe wie auf einem dichten. Der Speicher ist die V mal V Distanzmatrix, plus eine zweite Matrix, wenn du Wege und nicht nur ihre Längen rekonstruieren willst. In der Praxis ist V hoch 3 bis zu einigen tausend Knoten vertretbar; bei 5.000 sind es 125 Milliarden Operationen, und Dijkstra von jedem Knoten aus, mit O(V·E·log V), wird auf dünnen Graphen zur besseren Wahl.
Floyd-Warshall gewinnt bei Dichte und Einfachheit und verliert deutlich auf großen dünnen Graphen.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Dijkstra von jedem Knoten | Dünner Graph ohne negative Gewichte. Deutlich schneller, wenn E weit unter V hoch 2 liegt. | O(V·E·log V) |
| Johnson-Algorithmus | Dünner Graph mit negativen Gewichten. Gewichtet mit Bellman-Ford um und führt dann Dijkstra von jedem Knoten aus. | O(V·E + V^2·log V) |
| BFS von jedem Knoten | Der Graph ist ungewichtet, du brauchst also nur Schrittzahlen zwischen allen Paaren. | O(V·(V + E)) |
| Transitive Hülle | Du brauchst nur Erreichbarkeit, keine Distanz. Dieselbe Dreifachschleife mit booleschem ODER, also Warshalls ursprünglicher Algorithmus. | O(V^3) |
Den ganzen Artikel lesen: Shortest Path Algorithms Explained
Verwandte Algorithmen: Dijkstra-Algorithmus, Bellman-Ford-Algorithmus