Der Floyd-Warshall-Algorithmus ist ein all-pairs shortest paths Algorithmus zur bestimmung kürzester Wege in gewichteten, gerichteten Graphen.
Idee
- Der Algorithmus nutzt die Entwurfsmethode der Dynamische Programmierung
- Als Eingabe bekommt er die Gewichtungsmatrix
- Schritt für Schritt wird über jeden Knoten
iteriert und geschaut, ob ein Weg von nach unter Verwendung dieses Knotens billiger wird:
Beispiel
graph LR 2-->|8|1 2-->|2|3 3-->|5|1 3-->|1|4 1-->|3|2 4-->|2|1 1-->|7|4
Iterationen:
: Da zwischen Start- und Endknoten andere Knoten liegen dürfen, entspricht diese Matrix der Gewichtungsmatrix . : Hier stehen alle kürzesten Wege, wenn man als Zwischenknoten den Knoten erlaubt. Berechnung:
Anmerkungen:
- Für
bleiben die erste Zeile und die erste Spalte unberührt, für die zweite usw.
Das liegt daran, dass diese Wege ja schon bei k starten oder enden, ein Einbezug des Knotens k kann den Weg also gar nicht verkürzen. Gibt es keine negativen Zyklen im Graphen, ist jeder Wert auf der Diagonalen gleich.
Implementierung
Pseudocode
Sei
- Algorithmus FloydWarshall(
) - Für
bis - Sei
eine Matrix - Für
bis - Für
bis
- Für
- Sei
- Rückgabe:
Durch die 3 Schleifen hat der Algorithmus eine Laufzeit von