Gegeben sei ein gerichteter Graph G = (V, E) mit V = {0, ..., n-1}, n ∈ ℕ. Gefragt ist für alle Paare von Knoten (i, j), ob es in G einen Weg von i nach j gibt.
Der Algorithmus von Warshall [War 62] berechnet als Ergebnis einen Graphen G+ = (V, E+), der genau dann eine Kante (i, j) enthält, wenn es in G einen Weg von i nach j gibt. Der Graph G+ heißt transitive Hülle von G, da seine Kantenrelation E+ die kleinste transitive Relation ist, die E umfasst.
Bild 1 zeigt als Beispiel einen Graphen G. Die transitive Hülle G+ von G enthält zusätzliche Kanten, so beispielsweise die Kante (3,1), weil es in G einen Weg von 3 nach 1 gibt. Alle auf diese Weise hinzukommenden Kanten von G+ werden weiter unten in einer Simulation berechnet.
Bild 1: Graph G und transitive Hülle G+
Der Graph G+ wird aus G entwickelt, indem schrittweise neue Kanten hinzugenommen werden. In Schritt 0 kommt eine Kante (i, j) hinzu, wenn sich aus zwei Kanten ein Weg von i nach j bilden lässt, der über den Knoten 0 führt (d.h. wenn (i, 0) und (0, j) Kanten sind). In Schritt 1 kommt eine Kante (i, j) hinzu, wenn sich aus zwei Kanten ein Weg von i nach j bilden lässt, der über den Knoten 1 führt; hierbei werden die in Schritt 0 neu gefundenen Kanten mit berücksichtigt. Dieses Verfahren wird bis zum Knoten n-1 fortgesetzt.
In jedem Schritt k entsprechen die bis dahin gefundenen Kanten den Wegen, deren innere Knoten alle ≤ k sind. Damit repräsentieren die in Schritt n-1 bis dahin gefundenen Kanten alle Wege (Beweis durch vollständige Induktion).
Warshall-Algorithmus
Eingabe:
Graph G mit V = {0, ..., n-1}
Ausgabe:
Graph G+
Methode:
Es gibt unterschiedliche Möglichkeiten, einen Graphen als Datenstruktur zu repräsentieren. Eine einfache Möglichkeit besteht darin, die Kanten des Graphen in Form einer Adjazenzmatrix darzustellen.
Definition: Sei G = (V, E) ein Graph mit V = {0, ..., n-1}, n ∈ ℕ. Die Adjazenzmatrix des Graphen ist eine boolesche n × n-Matrix A, für die gilt
Ai,j = |
|
für alle i, j ∈ V.
Beispiel: Adjazenzmatrix des Graphen G aus Bild 1 (leere Einträge = false, 1 = true)
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 1 | 1 | |||
1 | 1 | ||||
2 | 1 | ||||
3 | 1 | ||||
4 |
Die Implementierung des Warshall-Algorithmus entwickelt aus der Adjazenzmatrix A des Graphen G schrittweise die Adjazenzmatrix A+ der transitiven Hülle G+ des Graphen.
Algorithmus warshall
Eingabe:
n × n-Adjazenzmatrix A eines Graphen G
Ausgabe:
n × n-Adjazenzmatrix A+ des Graphen G+ mit A+i,j = true, falls es einen Weg von Knoten i nach Knoten j gibt und A+i,j = false sonst
Methode:
Wichtig ist die Reihenfolge der Schleifen: Die k-Schleife muss die äußere Schleife sein.
Gegeben sei ein Graph G = (V, E) mit V = {0, ..., n-1}, n ∈ ℕ. Der Algorithmus von Floyd [Flo 62] berechnet für alle Paare von Knoten (i, j) die Länge des kürzesten Weges von i nach j. Der Algorithmus hat dieselbe Struktur wie der Warshall-Algorithmus. Statt der Operationen || (Oder) und && (Und) werden die Operationen min und + verwendet. Statt der Adjazenzmatrix wird eine Matrix A eingegeben, wobei
Ai,j = |
|
Algorithmus floyd
Eingabe:
n × n-Matrix A mit Ai,j = 1 falls (i, j) ∈ E und Ai,j = ∞ sonst
Ausgabe:
n × n-Matrix A mit Ai,j = d falls der kürzeste Weg von Knoten i nach Knoten j die Länge d hat und Ai,j = ∞ falls es keinen Weg von i nach j gibt
Methode:
Der Beweis des Floyd-Algorithmus folgt analog dem Beweis des Warshall-Algorithmus. Der Algorithmus funktioniert auch mit beliebigen, nichtnegativen Kantengewichten.
Der Floyd-Algorithmus berechnet in dieser Form nur die Länge des kürzesten Weges. Um den kürzesten Weg selbst zu konstruieren, wird parallel zu A eine weitere Matrix F geführt, in der als Eintrag Fi,j jeweils der erste Knoten auf dem kürzesten Weg von i nach j steht. Jedes Mal, wenn der Floyd-Algorithmus einen kürzeren Weg von i nach j als den bisher bekannten findet, wird Fi,j aktualisiert.
Transitive Hülle und kürzeste Wege sind Spezialfälle des sogenannten algebraischen Pfadproblems [AHU 74][CLRS 01][Lan 88].
Originalartikel:
[Flo 62] R.W. Floyd: Algorithm 97: Shortest Path. Communications of the ACM, 5, 6, 345 (1962)
[War 62] S. Warshall: A Theorem on Boolean Matrices. Journal of the ACM, Vol. 9, 1, 11-12 (1962)
Die algebraischen Grundlagen für die Lösung von Pfadproblemen in Graphen finden sich in [AHU 74] und in [CLRS 01]. Eine parallele Implementation des Warshall-Algorithmus und eines Algorithmus zur Lösung des algebraischen Pfadproblems ist in [Lan 88] bzw. unter [1] angegeben.
[AHU 74] A.V. Aho, J.E. Hopcroft, J.D. Ullman: The Design and Analysis of Computer Algorithms. Addison-Wesley (1974)
[CLRS 01] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein: Introduction to Algorithms. 2. Auflage, The MIT Press (2001)
[Lan 88] H.W. Lang: Transitive Closure on the Instruction Systolic Array. In: K. Bromley, S.Y. Kung, E. Swartzlander (eds.): Proceedings of the Int. Conf. on Systolic Arrays, San Diego, Computer Society Press, Washington D.C., 295-304 (1988)
Weiter mit: [Minimaler Spannbaum] [Literatur] oder [up]