Minimale Spannbäume Kürzestes Pfade Wiederholung Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Problemstellung Algorithmen und Datenstrukturen Kapitel 9 Definition (Bestimmung eines minimalen Spannbaums) Eingabe: Gegeben ein ungerichteter Graph G = (V , E ) und eine Gewichtsfunktion w : E → R+ . Gesucht: Ein Spannbaum T derart, dass X w (T ) = w (u, v ) Minimale Spannbäume und Kürzeste Pfade (u,v )∈E (T ) minimal ist. Mit E (T ) werden dabei die Kanten von T bezeichnet. T wird minimaler Spannbaum oder MST genannt. Frank Heitmann [email protected] Ein Spannbaum von G ist ein zusammenhängender und azyklischer Teilgraph (also ein Baum) von G , der alle Knoten von G enthält. 9. Dezember 2015 Frank Heitmann [email protected] 1/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Ein Beispiel 11 A 6 8 3 B C 2/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Ein Beispiel 2 Frank Heitmann [email protected] 4 E 2 12 D 6 7 I F 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 4 E 12 D 6 7 I 2 F 1 G K 10 5 H 5 J 14 Anmerkung Anmerkung Alle Spannbäume haben |V | − 1 Kanten. Es ist oben also wichtig, dass das summierte Gewicht dieser Kanten minimiert werden soll. Bei ungewichteten (!) Graphen liefern Breiten- und Tiefensuche also bereits minimale Spannbäume. Alle Spannbäume haben |V | − 1 Kanten. Es ist oben also wichtig, dass das summierte Gewicht dieser Kanten minimiert werden soll. Bei ungewichteten (!) Graphen liefern Breiten- und Tiefensuche also bereits minimale Spannbäume. Frank Heitmann [email protected] 3/143 Frank Heitmann [email protected] 4/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Die generelle Idee Die generelle Idee Algorithmus 1 GenericMST(G , w ) 1: A = ∅ 2: while A bildet keinen Spannbaum do 3: bestimme eine für A sichere Kante (u, v ) 4: A = A ∪ {(u, v )} 5: end while 6: return A Die Idee ist, dass der Algorithmus sukzessive eine Kantenmenge A aufbauen soll, wobei folgende Schleifeninvariante erhalten bleiben soll: Unmittelbar vor jeder Iteration ist A eine Teilmenge eines minimalen Spannbaums. In jedem Schritt wird eine Kante bestimmt, die hinzugefügt werden kann, ohne dass die Invariante verletzt wird. Solche Kanten werden als sicher bezeichnet. Eine Kante e ist also sicher für eine Teilmenge A eines minimalen Spannbaums, wenn A ∪ {e} weiterhin Teilmenge eines (möglicherweise anderen) minimalen Spannbaums ist. Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Anmerkung A ist die bisher ermittelte Kantenmenge des Spannbaums. In jedem Schritt wird zu A eine sichere Kante hinzugefügt. Der schwierige Teil ist die Bestimmung einer sicheren Kante. 5/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Die Schleifeninvariante 6/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Einige Definitionen Wir ermitteln gleich eine Regel, mit der sichere Kanten erkannt werden können. Diese wird dann in zwei Algorithmen genutzt, um effizient sichere Kanten zu bestimmen. Vorher einige Definitionen... Algorithmus 2 GenericMST(G , w ) 1: A = ∅ 2: while A bildet keinen Spannbaum do 3: bestimme eine für A sichere Kante (u, v ) 4: A = A ∪ {(u, v )} 5: end while 6: return A Definition Sei G = (V , E ) ein ungerichteter Graph. Ein Schnitt (S, V − S) ist eine Partitionierung von V . Eine Kante (u, v ) ∈ E kreuzt den Schnitt, wenn ihre Endpunkte in verschiedenen Partitionen liegen. Pause to Ponder Unmittelbar vor jeder Iteration ist A eine Teilmenge eines minimalen Spannbaums. Eine Kante ist eine leichte, den Schnitt kreuzende Kante, falls sie das kleinste Gewicht aller Kanten hat, die den Schnitt kreuzen. Initialisierung? Fortsetzung? Terminierung? Und gibt es immer eine sichere Kante? Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Ein Schnitt respektiert eine Kantenmenge A, falls keine Kante von A den Schnitt kreuzt. 7/143 Frank Heitmann [email protected] 8/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Zur Illustration... Eine wichtige Regel 11 A 6 8 3 B 2 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 12 D 4 C G 6 7 I 2 F H 5 K 10 5 1 J Beweis Sei T ein minimaler Spannbaum, der A enthält und gelte (u, v ) 6∈ E (T ), sonst wären wir sofort fertig. Wir konstruieren nun durch ’Ausschneiden und Einfügen’ einen anderen minimalen Spannbaum T 0 mit A ∪ {(u, v )} ⊆ E (T 0 ), woraus dann folgt, dass (u, v ) sicher für A ist. ... 14 Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Satz Sei G = (V , E ) ein zusammenhängender, ungerichteter Graph und w : E → R+ eine Gewichtsfunktion. Sei A ⊆ E Teilmenge eines minimalen Spannbaums von G , (S, V − S) ein Schnitt von G , der A respektiert und (u, v ) eine leichte Kante, die (S, V − S) kreuzt. Dann ist die Kante (u, v ) für A sicher. 9/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Zur Illustration des Beweises x u P P y y v v Beweis Ziel: A ∪ {(u, v )} ⊆ E (T 0 ) und T 0 ist MST. Die Knoten von S sind grau, die von S − V weiß. Die Kanten von T sind eingezeichnet, nicht die von G . Kanten von A sind dick. Die Kante (u, v ) gehört zu G , nicht zu T . Sie ist eine leichte, den Schnitt (S, V − S) kreuzende Kante. Die Kante (x, y ) liegt auf dem Pfad P in T von u nach v . Man erhält T 0 , indem man (x, y ) aus T entfernt und die Kante (u, v ) hinzufügt. Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Eine wichtige Regel - Der Beweis x u 10/143 (u, v ) bildet mit dem Pfad P, der in T von u nach v führt einen Zyklus. (u, v ) kreuzt den Schnitt (S, V − S), daher gibt es einen Kante (x, y ) auf P, die den Schnitt (ebenfalls) kreuzt. 11/143 Frank Heitmann [email protected] 12/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Eine wichtige Regel - Der Beweis Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Eine wichtige Regel - Der Beweis x x u u P y P y v v Beweis Ziel: A ∪ {(u, v )} ⊆ E (T 0 ) und T 0 ist MST. Beweis (x, y ) 6∈ A, da der Schnitt A respektiert. Z.Z.: T 0 ist (auch) ein MST. Da (x, y ) und (u, v ) beide den Schnitt kreuzen, (u, v ) aber eine leichte Kante ist, gilt zunächst w (u, v ) ≤ w (x, y ). Damit folgt w (T 0 ) = w (T ) − w (x, y ) + w (u, v ) ≤ w (T )(≤ w (T 0 )), also w (T 0 ) = w (T ) und beides sind MSTs. Da T ein Baum ist, zerfällt er durch entfernen von (x, y ) in zwei Komponenten und wird durch hinzufügen von (u, v ) wieder zu einem Spannbaum: T 0 = (T − {(x, y )}) ∪ {(u, v )} Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 13/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Eine wichtige Regel - Der Beweis 14/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Eine wichtige Regel x u P y Satz Sei G = (V , E ) ein zusammenhängender, ungerichteter Graph und w : E → R+ eine Gewichtsfunktion. Sei A ⊆ E Teilmenge eines minimalen Spannbaums von G , (S, V − S) ein Schnitt von G , der A respektiert und (u, v ) eine leichte Kante, die (S, V − S) kreuzt. Dann ist die Kante (u, v ) für A sicher. v Beweis. Ziel: A ∪ {(u, v )} ⊆ E (T 0 ) und T 0 ist MST. Z.Z.: A ∪ {(u, v )} ⊆ E (T 0 ). Da A ⊆ E (T ) gilt und (x, y ) 6∈ A folgt A ⊆ E (T 0 ) und somit auch A ∪ {(u, v )} ⊆ E (T 0 ). Damit ist alles gezeigt. Frank Heitmann [email protected] 15/143 Frank Heitmann [email protected] 16/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Folgerungen für den Algorithmus Eine wichtige Folgerung Satz Sei G = (V , E ) ein zusammenhängender, ungerichteter Graph und w : E → R+ eine Gewichtsfunktion. Sei A ⊆ E Teilmenge eines minimalen Spannbaums von G und C = (VC , EC ) eine Zusammenhangskomponente aus GA = (V , A). Falls (u, v ) unter allen Kanten, die C mit einer anderen Komponente von GA verbinden, das kleinste Gewicht hat, dann ist (u, v ) für A sicher. Zu jedem Zeitpunkt im Algorithmus GenericMST gilt A ist azyklisch, der Graph GA = (V , A) ist ein Wald, dessen Zusammenhangskomponenten Bäume sind (evtl. bestehend aus nur einem Knoten), jede für A sichere Kante verbindet unterschiedliche Komponenten von GA . Beweis. Der Schnitt (VC , V − VC ) respektiert A (sonst wäre VC keine Zusammenhangskomponente) und (u, v ) ist eine leichte Kante für diesen Schnitt. Nach dem eben bewiesenen Satz ist (u, v ) dann sicher für A. Die Schleife wird nun |V | − 1 mal ausgeführt. Anfangs, wenn A leer ist, gibt es |V | Bäume in GA . Ihre Anzahl wird bei jeder Iteration um eins vermindert. Wenn GA nur ein einzelner Baum ist, terminiert der Algorithmus. Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 17/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Zur Nachbereitung 18/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Kruskal - Die Idee Der Algorithmus von Kruskal basiert auf eben bewiesenen Satz und erweitert den generischen Algorithmus um eine Vorschrift, wie die sichere Kante bestimmt werden soll. Die Idee ist sehr einfach: Anmerkung (zur Nachbereitung) Zusammenhangskomponenten eines ungerichteten Graphen (wie eben die Komponente GA ) sind hier immer maximal zu wählen. D.h. möglichst viele Knoten sind in die Knotenmenge aufzunehmen (gerade all jene, die über Pfade erreicht werden können). Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Nimm unter allen Kanten jene mit dem kleinsten Gewicht, deren Hinzufügen nicht zu einem Kreis führt. Die Menge A ist also ein Wald. Die hinzugefügte, sichere Kante ist immer eine Kante mit minimalen Gewicht, die zwei verschiedene Komponenten (von GA ) verbindet. Die Korrektheit dieses Verfahrens folgt sofort aus dem eben vorgestellten Satz. 19/143 Frank Heitmann [email protected] 20/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Beispiel Kruskal - Beispiel 11 A 6 8 3 B 2 E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 8 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 22/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Kruskal - Beispiel 11 3 E D C Kruskal - Beispiel B 3 B 21/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 23/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 24/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Beispiel Kruskal - Beispiel 11 A 6 8 3 B 2 E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 8 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 26/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Kruskal - Beispiel 11 3 E D C Kruskal - Beispiel B 3 B 25/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 27/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 28/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Beispiel Kruskal - Beispiel 11 A 6 8 3 B 2 E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 8 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 30/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Kruskal - Beispiel 11 3 E D C Kruskal - Beispiel B 3 B 29/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 31/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 32/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Beispiel Kruskal - Beispiel 11 A 6 8 3 B 2 E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 8 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 34/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Kruskal - Beispiel 11 3 E D C Kruskal - Beispiel B 3 B 33/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 35/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 36/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Beispiel Kruskal - Beispiel 11 A 6 8 3 B 2 E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 8 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 38/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Kruskal - Beispiel 11 3 E D C Kruskal - Beispiel B 3 B 37/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 39/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 40/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Datenstrukturen disjunkter Mengen Kruskal - Pseudocode Algorithmus 3 KruskalMST(G , w ) 1: A = ∅ 2: for alle v ∈ V (G ) do 3: MakeSet(v ) 4: end for 5: sortiere E in nichtfallender Reihenfolge nach dem Gewicht w 6: for alle (u, v ) ∈ E (sortiert) do 7: if FindSet(u) 6= FindSet(v ) then 8: A = A ∪ {(u, v )} 9: Union(u, v ) 10: end if 11: end for 12: return A Die Implementierung ist nun recht anspruchsvoll. Wir benötigen eine Datenstruktur für disjunkte Mengen. Eine solche verwaltet eine Menge S = {S1 , S2 , . . . , Sk } von disjunkten dynamischen Mengen. Jede Menge wird durch einen Repräsentanten dargestellt. Wichtige Funktionen: MakeSet(v ). Erzeugt eine neue Menge, deren einziges Element v ist. v ist dann Repräsentant dieser Menge. FindSet(v ). Gibt einen Zeiger auf den Repräsentanten der (eindeutigen) Menge zurück, die v enthält. Union(u, v ). Vereinigt die dynamischen Mengen, die u und v enthalten Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 41/143 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal - Ergebnis 42/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Prim - Die Idee Ähnlich wie der Algorithmus von Kruskal basiert auch der Algorithmus von Prim auf einer einfachen Idee, um die sichere Kante auszuwählen: Die Korrektheit folgt aus den vorherigen Sätzen und aus der Korrektheit der Methoden der Datenstruktur für disjunkte Mengen (wäre noch zu zeigen). Wähle aus den Kanten eine minimale aus, die A mit einem noch isolierten Knoten von GA verbindet. (Ganz zu Anfang startet man mit einem beliebigen Knoten.) Die Laufzeit hängt auch stark von letztgenannten Methoden ab. Sie ist in O(E · log V ) möglich. ⇒ Idee des Verfahrens ist schnell erklärt, aber sowohl die Implementierung als auch die Beweisführung ist sehr anspruchsvoll. Die Menge A ist hier also ein einzelner Baum. Die hinzugefügte, sichere Kante ist immer eine Kante mit minimalen Gewicht, die den Baum mit einem Knoten verbindet, der noch nicht zum Baum gehörte. Die Korrektheit dieses Verfahrens folgt wieder aus dem vorhin vorgestellten Satz... Für Interessierte Interessierte Leser finden mehr dazu in Kapitel 21 im [Cormen]. Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 43/143 Frank Heitmann [email protected] 44/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Eine wichtige Folgerung - Wiederholung Prim - Ein Beispiel Satz Sei G = (V , E ) ein zusammenhängender, ungerichteter Graph und w : E → R+ eine Gewichtsfunktion. Sei A ⊆ E Teilmenge eines minimalen Spannbaums von G und C = (VC , EC ) eine Zusammenhangskomponente aus GA = (V , A). Falls (u, v ) unter allen Kanten, die C mit einer anderen Komponente von GA verbinden, das kleinste Gewicht hat, dann ist (u, v ) für A sicher. Frank Heitmann [email protected] 6 3 B 2 C 4 3 B 2 E 12 D 4 6 7 C I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 46/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Prim - Ein Beispiel 11 8 6 8 Prim - Ein Beispiel A 11 A 45/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 47/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 48/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Prim - Ein Beispiel 6 8 3 B 2 Prim - Ein Beispiel 11 A E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 3 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 50/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Prim - Ein Beispiel 11 B E D C Prim - Ein Beispiel 8 3 B 49/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 51/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 52/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Prim - Ein Beispiel 6 8 3 B 2 Prim - Ein Beispiel 11 A E 6 7 C I 2 12 D 4 F 1 G 5 H J 2 14 6 3 2 C 4 4 12 6 7 I 2 F 1 G K 10 5 H 5 J 14 Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 54/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Prim - Ein Beispiel 11 B E D C Prim - Ein Beispiel 8 3 B 53/143 Minimale Spannbäume Kürzestes Pfade Wiederholung 6 8 K 10 11 A 5 Frank Heitmann [email protected] A Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E 2 12 D 6 7 I F Frank Heitmann [email protected] 1 G 5 H 5 J 6 8 K 10 11 A 3 B 2 14 C 55/143 4 E 12 D 6 7 I 2 F Frank Heitmann [email protected] 1 G K 10 5 H 5 J 14 56/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Prim - Ein Beispiel 6 8 3 B 2 Implementierung 11 A E 6 7 C I 2 12 D 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick F 1 G Im nachfolgenden Algorithmus wird mit einer Min-Prioritätswarteschlange gearbeitet (die man z.B. mit binären Min-Heaps implementieren könnte). In dieser werden alle nicht zum Baum gehörenden Knoten gespeichert. 5 K 10 5 H Die Schwierigkeit bei der Implementierung besteht darin, die Auswahl der Kante, die zu A hinzugefügt werden soll, möglichst einfach (d.h. effizient) zu gestalten. J 14 schlüssel[v ] ist das kleinste Gewicht aller Kanten, die v mit einem Knoten des (bisherigen) Baumes verbinden (und muss daher u.U. im Verlauf angepasst werden). Die Menge A wird implizit als A = {(v , π[v ]) | v ∈ V − {r } − Q} gehalten. Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 57/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Prim - Pseudocode 58/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Prim - Anmerkung Algorithmus 4 PrimMST(G , w , r ) 1: for alle v ∈ V (G ) do 2: schlüssel[v ] = ∞, π[v ] = nil 3: end for 4: schlüssel[r ] = 0, Q = V (G ) 5: while Q 6= ∅ do 6: u = ExtractMin(Q) 7: for alle v ∈ Adj[u] do 8: if v ∈ Q und w (u, v ) < schlüssel[v ] then 9: π[v ] = u 10: schlüssel[v ] = w (u, v ) 11: end if 12: end for 13: end while Frank Heitmann [email protected] Frank Heitmann [email protected] Anmerkung (zur Nachbereitung) Man beachte: Der Algorithmus arbeitet etwas anders als im Beispiel oben, da ja π[v ] und schlüssel[v ] u.U. mehrmals gesetzt werden. (Dies ist nötig, um den Spannbaum zu konstruieren und geschah vorher implizit indem z.B. immer wieder alle Kanten betrachtet wurden.) Im nachfolgenden Beispiel ist das erste Element im Tupel der Knotenname, das zweite ist schlüssel[v ] und das dritte ist π[v ]. 59/143 Frank Heitmann [email protected] 60/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung PrimMST - Ein Beispiel 11 A,0,n I,i,n 6 3 B,i,n 2 PrimMST - Ein Beispiel E,i,n 8 2 12 D,i,n 5 7 C,i,n F,i,n 1 K,i,n 2 61/143 11 3 2 C,i,n 4 F,i,n 1 14 H,i,n J,i,n Frank Heitmann [email protected] 62/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 2 12 D,i,n 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel 6 B,8,A 4 5 10 G,i,n 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E,11,A 8 I,i,n 2 12 D,i,n C,i,n PrimMST - Ein Beispiel A,0,n 3 B,8,A J,i,n Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung E,11,A 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 6 5 7 F,i,n Frank Heitmann [email protected] 1 5 10 G,i,n H,i,n 11 A,0,n E,11,A 6 8 K,i,n 3 B,8,A 2 14 J,i,n C,i,n 63/143 I,i,n 4 2 12 D,i,n 5 7 F,i,n Frank Heitmann [email protected] 10 G,i,n 6 1 5 H,i,n K,i,n 14 J,i,n 64/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung PrimMST - Ein Beispiel 11 A,0,n 3 B,8,A 2 PrimMST - Ein Beispiel E,11,A I,i,n 6 8 2 12 D,3,B 5 7 C,2,B F,i,n 1 K,i,n J,i,n 65/143 11 3 B,8,A 2 C,2,B E,11,A 4 F,i,n 1 14 H,i,n J,i,n Frank Heitmann [email protected] 66/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 2 12 D,3,B 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel 6 8 4 5 10 G,i,n 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel A,0,n I,i,n 2 12 D,3,B C,2,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,11,A 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 6 5 7 F,i,n Frank Heitmann [email protected] 1 5 10 G,i,n H,i,n 11 A,0,n 3 B,8,A 2 14 J,i,n C,2,B 67/143 I,i,n 6 8 K,i,n E,11,A 4 2 12 D,3,B 5 7 F,i,n Frank Heitmann [email protected] 10 G,i,n 6 1 5 H,i,n K,i,n 14 J,i,n 68/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung PrimMST - Ein Beispiel 11 A,0,n 3 B,8,A 2 PrimMST - Ein Beispiel E,6,D I,i,n 6 8 2 12 D,3,B 5 7 C,2,B F,7,D 1 K,i,n J,i,n 69/143 11 3 B,8,A 2 C,2,B E,6,D 4 F,7,D 1 14 H,i,n J,i,n Frank Heitmann [email protected] 70/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 2 12 D,3,B 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel 6 8 4 5 10 G,i,n 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel A,0,n I,i,n 2 12 D,3,B C,2,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,6,D 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 6 5 7 F,7,D Frank Heitmann [email protected] 1 5 10 G,i,n H,i,n 11 A,0,n 3 B,8,A 2 14 J,i,n C,2,B 71/143 I,i,n 6 8 K,i,n E,6,D 4 2 12 D,3,B 5 7 F,7,D Frank Heitmann [email protected] 10 G,6,F 6 1 5 H,1,F K,i,n 14 J,i,n 72/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung PrimMST - Ein Beispiel 11 A,0,n 3 B,8,A 2 PrimMST - Ein Beispiel E,6,D I,i,n 6 8 2 12 D,3,B 5 7 C,2,B F,7,D 1 K,i,n J,i,n 73/143 11 3 B,8,A 2 C,2,B E,6,D 4 F,7,D 1 14 H,1,F J,i,n Frank Heitmann [email protected] 74/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 2 12 D,3,B 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel 6 8 4 5 10 G,5,H 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel A,0,n I,i,n 2 12 D,3,B C,2,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,6,D 6 8 14 H,1,F 11 A,0,n 5 10 G,6,F 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 6 5 7 F,7,D Frank Heitmann [email protected] 1 5 10 G,5,H H,1,F 11 A,0,n 3 B,8,A 2 14 J,i,n C,2,B 75/143 I,2,G 6 8 K,i,n E,6,D 4 2 12 D,3,B 5 7 F,7,D Frank Heitmann [email protected] 10 G,5,H 6 1 5 H,1,F K,i,n 14 J,i,n 76/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung PrimMST - Ein Beispiel 11 A,0,n 3 B,8,A 2 PrimMST - Ein Beispiel E,6,D I,2,G 6 8 2 12 D,3,B 5 7 C,2,B F,7,D 1 K,5,I J,10,I 77/143 11 3 B,8,A 2 C,2,B E,6,D 4 F,7,D 1 14 H,1,F J,10,I Frank Heitmann [email protected] 78/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,2,G 2 12 D,3,B 5 7 K,5,I Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel 6 8 4 5 10 G,5,H 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick PrimMST - Ein Beispiel A,0,n I,2,G 2 12 D,3,B C,2,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,6,D 6 8 14 H,1,F 11 A,0,n 5 10 G,5,H 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 6 5 7 F,7,D Frank Heitmann [email protected] 1 5 10 G,5,H H,1,F 11 A,0,n 3 B,8,A 2 14 J,10,I C,2,B 79/143 I,2,G 6 8 K,5,I E,6,D 4 2 12 D,3,B 5 7 F,7,D Frank Heitmann [email protected] 10 G,5,H 6 1 5 H,1,F K,5,I 14 J,10,I 80/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Prim - Schleifeninvariante Zur Nachbereitung Wir müssen nun noch die Korrektheit des Algorithmus zeigen. Wir wussten vorher nur, dass die Idee (diese Kante zu nehmen) korrekt ist. Nachweisen müssen wir aber, dass der Algorithmus dies auch stets tut und somit die Idee von Prim korrekt implementiert. Anmerkung (zur Nachbereitung) Bei Kruskal war dies nicht nötig, da die Implementierung bereits sehr dicht an der Idee war. Vor jeder Iteration der while-Schleife gilt: 1 A = {(v , π[v ]) | v ∈ V − {r } − Q} 2 Die Knoten, die sich bereit im MST befinden, sind jene aus V − Q. 3 Ist v ∈ Q mit π[v ] 6= nil, so ist schlüssel[v ] das Gewicht einer Kante (v , π[v ]), die v mit einem Knoten verbindet, der bereits zum minimalen Spannbaum gehört und die unter allen Kanten mit dieser Eigenschaft minimal ist. Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Anmerkung (zur Nachbereitung) Die Schleifeninvariante wäre nun formal zu zeigen (und daraus die Korrektheit zu folgern). Wir diskutieren dies nachfolgend nur kurz anhand des Pseudocodes. (Wer nicht in der Vorlesung war: Gilt die Schleifeninvariante bei der Initialisierung? Klappt’s mit der Fortsetzung? Terminiert der Algorithmus und liefert die Schleifeninvariante dann etwas, womit die Korrektheit des Algorithmus gefolgert werden kann?) 81/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Prim - Pseudocode (Wdh.) 82/143 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Prim - Laufzeitanalyse Algorithmus 5 PrimMST(G , w , r ) 1: for alle v ∈ V (G ) do 2: schlüssel[v ] = ∞, π[v ] = nil 3: end for 4: schlüssel[r ] = 0, Q = V (G ) 5: while Q 6= ∅ do 6: u = ExtractMin(Q) 7: for alle v ∈ Adj[u] do 8: if v ∈ Q und w (u, v ) < schlüssel[v ] then 9: π[v ] = u 10: schlüssel[v ] = w (u, v ) 11: end if 12: end for 13: end while Frank Heitmann [email protected] Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Wir benutzen einen binären MinHeap. Damit folgt: Die Initialisierung geht in O(V ). Der Rumpf der while-Schleife wird |V |-mal ausgeführt. Jede ExtractMin-Operation benötigt O(log V ) Zeit, also benötigen wir für diese Operation insgesamt O(V · log V ) Zeit. Die for-Schleife wird O(E )-mal ausgeführt. In ihrem Rumpf ist der Test auf Enthaltensein in O(1) möglich, indem man jeden Knoten v mit einem zusätzlichen Bit versieht, das aussagt, ob v in Q ist oder nicht. Die Zuweisung beinhaltet eine DecreaseKey-Operation, die in O(log V ) möglich ist. Insgesamt brauchen wir hier also O(E · log V ). Insgesamt ist die Laufzeit damit in O(V · log V + E · log V ) = O(E · log V ). 83/143 Frank Heitmann [email protected] 84/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal und Prim - Zusammenfassung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra... Beide vorgestellten Algorithmen (Kruskal und Prim) verwenden eine bestimmte Regel, um die sichere Kante zu bestimmen. Kruskal: Die Menge A ist ein Wald. Die hinzugefügte, sichere Kante ist immer eine Kante mit minimalen Geweicht, die zwei verschiedene Komponenten (von GA ) verbindet. Prim: Die Menge A ist ein einzelner Baum. Die hinzugefügte, sichere Kante ist immer eine Kante mit minimalen Gewicht, die den Baum mit einem Knoten verbindet, der noch nicht zum Baum gehörte. Beide Algorithmen sind nicht eindeutig. Die Algorithmen können verschiedene Ergebnisse liefern. Mit einer kleinen Änderung kann man das Problem der kürzesten Pfade bei einem einzigen Startknoten auf einem gewichteten (gerichteten oder ungerichteten) Graphen lösen... Mit guten Datenstrukturen ist Kruskal in O(E · log V ) möglich, Prim ist in O(E · log V ) bei Nutzung von Min-Heaps und sogar in O(E + V · log V ) bei Nutzung von Fibonacci-Heaps. Frank Heitmann [email protected] 85/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 11 2 C,i,n I,i,n 6 3 B,8,A 4 2 12 D,i,n 5 7 Frank Heitmann [email protected] 1 H,i,n 11 A,0,n 5 10 G,i,n 6 F,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel E,11,A 8 86/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel A,0,n Frank Heitmann [email protected] 3 B,8,A 2 14 J,i,n C,2,B 87/143 I,i,n 6 8 K,i,n E,11,A 4 2 12 D,3,B 5 7 F,i,n Frank Heitmann [email protected] 10 G,i,n 6 1 5 H,i,n K,i,n 14 J,i,n 88/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel 11 A,0,n I,i,n 6 3 B,8,A 2 Von Prim zu Dijkstra - Beispiel E,11,A 8 2 12 D,i,n 5 7 C,i,n F,i,n 1 K,i,n 2 89/143 11 3 2 C,i,n 4 2 5 7 Frank Heitmann [email protected] 1 14 H,i,n 1 J,i,n Frank Heitmann [email protected] H,i,n 11 A,0,n 5 10 G,i,n 6 F,i,n F,i,n 90/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 12 D,i,n 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel 6 B,i,n 4 5 10 G,i,n 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E,i,n 8 I,i,n 2 12 D,11,B C,10,B Von Prim zu Dijkstra - Beispiel A,0,n 3 B,8,A J,i,n Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung E,11,A 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick E,11,A 6 8 K,i,n 3 B,8,A 2 14 J,i,n C,i,n 91/143 I,i,n 4 2 12 D,i,n 5 7 F,i,n Frank Heitmann [email protected] 10 G,i,n 6 1 5 H,i,n K,i,n 14 J,i,n 92/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel 11 A,0,n I,i,n 6 3 B,8,A 2 Von Prim zu Dijkstra - Beispiel E,11,A 8 2 12 D,i,n 5 7 C,i,n F,i,n 1 K,i,n 2 93/143 11 3 B,8,A 2 C,10,B 4 2 5 7 Frank Heitmann [email protected] 1 14 H,i,n 1 J,i,n Frank Heitmann [email protected] H,i,n 11 A,0,n 5 10 G,i,n 6 F,i,n F,i,n 94/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 12 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel E,11,A D,11,B 4 5 10 G,i,n 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 6 8 I,i,n 2 12 D,i,n C,i,n Von Prim zu Dijkstra - Beispiel A,0,n 3 B,8,A J,i,n Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung E,11,A 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 4 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 3 B,8,A 2 14 C, 10,B J,i,n 95/143 I,i,n 6 8 K,i,n E,11,A 4 2 12 D,11,B 5 7 F,i,n Frank Heitmann [email protected] 10 G,i,n 6 1 5 H,i,n K,i,n 14 J,i,n 96/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel 11 A,0,n 3 B,8,A 2 Von Prim zu Dijkstra - Beispiel E,11,A I,i,n 6 8 2 12 D,11,B 4 5 7 F,i,n 1 K,i,n J,i,n 97/143 11 3 B,8,A 2 C, 10,B E,11,A 4 2 5 7 Frank Heitmann [email protected] 1 14 H,i,n 1 J,i,n Frank Heitmann [email protected] H,i,n 11 A,0,n 5 10 G,i,n 6 F,23,E F,23,E 98/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 12 D,11,B 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel 6 8 4 5 10 G,i,n 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel A,0,n I,i,n 2 12 D,11,B C, 10,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,11,A 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 C, 10,B Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 3 B,8,A 2 14 C, 10,B J,i,n 99/143 I,i,n 6 8 K,i,n E,11,A 4 2 12 D,11,B 5 7 F,18,D Frank Heitmann [email protected] 10 G,i,n 6 1 5 H,i,n K,i,n 14 J,i,n 100/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel 11 A,0,n 3 B,8,A 2 Von Prim zu Dijkstra - Beispiel E,11,A I,i,n 6 8 2 12 D,11,B 4 5 7 F,18,D 1 K,i,n J,i,n 101/143 11 3 B,8,A 2 C, 10,B E,11,A 4 2 5 7 Frank Heitmann [email protected] 1 14 J,i,n H,19,F 1 Frank Heitmann [email protected] H,19,F 11 A,0,n 5 10 G,24,F 6 F,18,D F,18,D 102/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,i,n 12 D,11,B 5 7 K,i,n Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel 6 8 4 5 10 G,24,F 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel A,0,n I,i,n 2 12 D,11,B C, 10,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,11,A 6 8 14 H,i,n 11 A,0,n 5 10 G,i,n 6 C, 10,B Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 3 B,8,A 2 14 C, 10,B J,i,n 103/143 I,i,n 6 8 K,i,n E,11,A 4 2 12 D,11,B 5 7 F,18,D Frank Heitmann [email protected] 10 G,24,F 6 1 5 H,19,F K,i,n 14 J,i,n 104/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel 11 A,0,n 3 B,8,A 2 Von Prim zu Dijkstra - Beispiel E,11,A 2 12 D,11,B 6 4 5 7 C, 10,B F,18,D 5 10 G,24,F 1 K,i,n J,i,n 105/143 11 3 B,8,A 2 C, 10,B E,11,A 4 2 5 7 Frank Heitmann [email protected] 1 14 H,19,F 1 J,36,I Frank Heitmann [email protected] H,19,F 11 A,0,n 5 10 G,24,F 6 F,18,D F,18,D 106/143 Minimale Spannbäume Kürzestes Pfade Wiederholung I,26,G 12 D,11,B 5 7 K,31,I Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel 6 8 4 5 10 G,24,F 6 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Von Prim zu Dijkstra - Beispiel A,0,n I,26,G 2 12 D,11,B C, 10,B Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 B,8,A 2 E,11,A 6 8 14 H,19,F 11 A,0,n I,26,G 6 8 Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick 3 B,8,A 2 14 C, 10,B J,36,I 107/143 I,26,G 6 8 K,31,I E,11,A 4 2 12 D,11,B 5 7 F,18,D Frank Heitmann [email protected] 10 G,24,F 6 1 5 H,19,F K,31,I 14 J,36,I 108/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Der Algorithmus von Kruskal Der Algorithmus von Prim Ausblick Minimale Spannbäume Kürzestes Pfade Wiederholung Von Prim zu Dijkstra - Beispiel Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Problemstellung Definition (Problem der kürzesten Pfade) 11 A,0,n 3 B,8,A C, 10,B I,26,G 6 8 2 E,11,A 4 2 12 D,11,B 5 7 1 5 10 G,24,F 6 F,18,D Eingabe: Gegeben ein gerichteter Graph G = (V , E ), eine Gewichtsfunktion w : E → R+ und ein Knoten s. Gesucht: Für jeden Knoten v ∈ V ein Pfad Pv , der in s beginnt, in v endet und der unter allen Pfaden mit dieser Eigenschaft das geringste Gewicht hat. H,19,F K,31,I 14 J,36,I Anmerkung Das Gewicht P eine Pfades p = [v0 , v1 , . . . , vk ] ist dabei definiert als w (p) = ki=1 w (vi−1 , vi ). Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 109/143 Frank Heitmann [email protected] Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Varianten 110/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Varianten Variante 1: Für jeden Knoten v ∈ V suchen wir einen kürzesten Pfad von einem Startknoten s aus (single-source). Variante 1: Für jeden Knoten v ∈ V suchen wir einen kürzesten Pfad von einem Startknoten s aus (single-source). Variante 2: Finde von allen Knoten einen kürzesten Pfad zu einem gegebenen Zielknoten. Variante 2: Finde von allen Knoten einen kürzesten Pfad zu einem gegebenen Zielknoten. Variante 3: Finde einen kürzesten Pfad für einen gegebenen Start- und einen gegebenen Zielknoten. Anmerkung Dreht man die Richtungen aller Kanten um, kann man 2 auf 1 zurückführen. Variante 4: Finde für jedes Knotenpaar u, v einen kürzesten Pfad von u nach v . Frank Heitmann [email protected] 111/143 Frank Heitmann [email protected] 112/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Varianten Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Varianten Variante 1: Für jeden Knoten v ∈ V suchen wir einen kürzesten Pfad von einem Startknoten s aus (single-source). Variante 1: Für jeden Knoten v ∈ V suchen wir einen kürzesten Pfad von einem Startknoten s aus (single-source). Variante 3: Finde einen kürzesten Pfad für einen gegebenen Start- und einen gegebenen Zielknoten. Variante 4: Finde für jedes Knotenpaar u, v einen kürzesten Pfad von u nach v . Anmerkung 1 löst 3 mit und es ist kein Verfahren für 3 bekannt, das im schlechtesten Fall wirklich asymptotisch schneller wäre (als der beste single-source-Algorithmus). Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Anmerkung 4 geht im Prinzip, indem man 1 für jeden Knoten löst, aber dies geht schneller (⇒ Floyd-Warshall-Algorithmus). 113/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Wichtige Eigenschaft kürzester Pfade 114/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Negative Gewichte und Zyklen Satz Kanten mit negativen Gewichten sind möglich, auch wenn nicht alle Algorithmen damit arbeiten können. Negative Zyklen verhindern aber kürzeste Pfade! Sei G = (V , E ) gewichteter, gerichteter Graph. w : E → R+ eine Gewichtsfunktion. Sei p = [v1 , v2 , . . . , vk ] ein kürzester Pfad von v1 nach vk und pij der Teilpfad von vi nach vj (1 ≤ i ≤ j ≤ k). Dann ist pij ein kürzester Pfad von vi nach vj . Der gleich folgenden Algorithmus von Dijkstra erlaubt keine negativen Gewichte. Der Bellman-Ford-Algorithmus erlaubt negative Gewichte und kann negative Zyklen entdecken. Beweis. Beweisidee: Nehmen wir an dies wäre nicht so, dann gäbe es einen kürzeren Pfad pij0 von vi nach vj . Ersetzt man pij in p durch diesen, erhält man einen kürzeren v1 -vk -Pfad im Widerspruch dazu, dass p ein kürzester Pfad ist. Frank Heitmann [email protected] Frank Heitmann [email protected] Normale Zyklen können vorkommen, werden aber bei einem kürzesten Pfad nie gebraucht (im Gegenteil!). Die Darstellung/Speicherung kürzester Pfade geschieht wieder mit der Vorgängerfunktion π[v ]. 115/143 Frank Heitmann [email protected] 116/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Zwei wichtige Hilfsfunktionen Zwei wichtige Hilfsfunktionen u 2 5 Algorithmus 6 InitSingleSource(G , s) 1: for alle v ∈ V (G ) do 2: d[v ] = ∞ 3: π[v ] = nil 4: end for 5: d[s] = 0 Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung v u 9 5 v 2 Relax(u,v,w) 6 Relax(u,v,w) u v u v 5 7 5 6 2 2 Algorithmus 7 Relax(u, v , w ) 1: if d[v ] > d[u] + w (u, v ) then 2: d[v ] = d[u] + w (u, v ) 3: π[v ] = u 4: end if 117/143 Frank Heitmann [email protected] Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Der Dijkstra-Algorithmus 118/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Beispiel Algorithmus 8 Dijkstra(G , w , s) 1: InitSingleSource(G , s) 2: S = ∅ 3: Q = V (G ) 4: while Q 6= ∅ do 5: u = ExtractMin(Q) 6: S = S ∪ {u} 7: for alle v ∈ Adj[u] do 8: if d[v ] > d[u] + w (u, v ) then 9: d[v ] = d[u] + w (u, v ) 10: π[v ] = u 11: end if 12: end for 13: end while Frank Heitmann [email protected] Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall 1 i 10 9 2 0 3 4 6 7 5 i 119/143 i Frank Heitmann [email protected] 2 i 120/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Beispiel Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Beispiel 1 10 10 3 10 4 5 5 121/143 6 7 2 Frank Heitmann [email protected] Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Beispiel 4 7 i Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 3 5 2 14 9 2 0 6 7 5 1 8 9 2 0 i 122/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Beispiel 1 8 10 3 10 4 5 Frank Heitmann [email protected] 2 3 5 123/143 4 6 7 5 7 9 9 2 0 6 7 5 1 8 9 2 0 13 Frank Heitmann [email protected] 2 7 124/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Beispiel Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Einführung 1 8 10 Der Bellman-Ford-Algorithmus löst wie Dijkstra das Problem der kürzesten Pfade bei einem Startknoten. Anders als Dijkstra dürfen Kantengewichte aber auch negativ sein. Der Algorithmus liefert false zurück, sollte ein Zyklus mit negativem Gewicht existieren. 9 2 0 9 3 4 6 7 5 5 2 7 Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 125/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Der Bellman-Ford-Algorithmus 126/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Beispiel Algorithmus 9 BellmanFord(G , w , s) 1: InitSingleSource(G , s) 2: for i = 1 to |V (G )| − 1 do 3: for alle (u, v ) ∈ E (G ) do 4: Relax(u, v , w ) 5: end for 6: end for 7: for alle (u, v ) ∈ E (G ) do 8: if d[v ] > d[u] + w (u, v ) then 9: return false 10: end if 11: end for Frank Heitmann [email protected] Frank Heitmann [email protected] t 5 x i -2 i 6 s -3 8 0 7 2 7 i y 9 -4 i z Kantendurchlauf: (t, x), (t, y ), (t, z), (x, t), (y , x), (y , z), (z, x), (z, s), (s, t), (s, y ) 127/143 Frank Heitmann [email protected] 128/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Beispiel Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Beispiel t 5 x t 5 x 6 -2 i 6 -2 4 6 s -3 6 8 0 7 2 7 7 y s -4 9 0 i 7 z y Frank Heitmann [email protected] 7 -4 2 7 Kantendurchlauf: (t, x), (t, y ), (t, z), (x, t), (y , x), (y , z), (z, x), (z, s), (s, t), (s, y ) Minimale Spannbäume Kürzestes Pfade Wiederholung -3 8 2 9 z Kantendurchlauf: (t, x), (t, y ), (t, z), (x, t), (y , x), (y , z), (z, x), (z, s), (s, t), (s, y ) 129/143 Frank Heitmann [email protected] Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Beispiel 130/143 Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Beispiel t 5 x t 5 x 2 -2 4 2 -2 4 6 s -3 6 8 0 7 2 7 7 y 9 s -4 8 0 7 2 7 2 7 z y Kantendurchlauf: (t, x), (t, y ), (t, z), (x, t), (y , x), (y , z), (z, x), (z, s), (s, t), (s, y ) Frank Heitmann [email protected] -3 9 -4 -2 z Kantendurchlauf: (t, x), (t, y ), (t, z), (x, t), (y , x), (y , z), (z, x), (z, s), (s, t), (s, y ) 131/143 Frank Heitmann [email protected] 132/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Anmerkungen zum Beispiel Einführung Anmerkung Der Floyd-Warshall-Algorithmus löst das Problem in der vierten Variante, d.h. er bestimmt zu jedem Paar zweier Knoten einen kürzesten Pfad zwischen ihnen. Kanten mit negativem Gewicht sind zugelassen. Der nachfolgende Algorithmus arbeitet aber nicht, sollten auch Zyklen mit negativem Gewicht vorhanden sein! Wir hatten im Beispiel vier (also |V (G )| − 1) Iterationen. Im Test der unteren for-Schleife finden wir nun nichts (keine Kante führt zu einer weiteren Relaxtion), also sind wir fertig. Wäre die Kante von z nach s mit z.B. 1 gewichtet, dann würde der Test in der untern for-Schleife nun false zurückliefern. Dies bedeutet auch, dass ein negativer Zyklus (von s nach s) gefunden wurde. Wir wollen dies nachfolgend nur kurz anreißen... Anmerkung (für Interessierte) Oben sind nur |V (G )| − 1 Iterationen nötig, da ansonsten schon maximale Zyklen (Zyklen, deren Länge der Anzahl der Knoten entspricht) gefunden werden. Die Idee des Algorithmus basiert auf einer ähnlichen Idee wie die Vorschrift, bei der Konstruktion eines regulären Ausdrucks zu einem Automaten (Kleene-Konstruktion, Rijk ). Laufzeit: O(V · E ). Frank Heitmann [email protected] 133/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Algorithmus 10 FloydWarhsall(W ) 1: n = zeilen[W ] 2: D 0 = W 3: for k = 1 to n do 4: for i = 1 to n do 5: for j = 1 to n do 6: dijk = min(dijk−1 , dikk−1 + dkjk−1 ) 7: end for 8: end for 9: end for k q j Die Pfade p und q haben nur Zwischenknoten aus {1, 2, . . . , k − 1}. Der ganze Pfad von i nach j enthält auch einmal den Knoten aus k. Frank Heitmann [email protected] 134/143 Der Floyd-Warshall-Algorithmus dijk = min(dijk−1 , dikk−1 + dkjk−1 ) i Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung Zur Illustration der Idee p Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall 135/143 Frank Heitmann [email protected] 136/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Minimale Spannbäume Kürzestes Pfade Wiederholung Kürzeste Pfade - Zusammenfassung Zusammenfassung und Ausblick Graphen Dijkstra. Für gewichtete, gerichtete Graphen, ohne negative Gewichte. Laufzeit: O(V 2 ) und sogar O(V · log V + E ). Grundlagen, Adjazenzmatrix, Adjazenzliste Breiten- & Tiefensuche Anwendung der Tiefensuche Bellman-Ford(-Moore). Für gewichtete, gerichtete Graphen. Negative Gewichte sind erlaubt. Laufzeit: O(V · E ). Topologisches Sortieren Bestimmung starker Zusammenhangskomponenten Floyd-Warshall. Für gewichtete, gerichtete Graphen. Negative Gewichte sind erlaubt. Laufzeit: O(V 3 ). Ermittelt anders als die obigen beiden, kürzeste Pfade für alle Knotenpaare! Minimale Spannbäume Definition Algorithmus von Kruskal Algorithmus von Prim Bestimmen der kürzesten Pfade Anmerkung Definition und Varianten Algorithmus von Dijkstra Algorithmus von Bellman-Ford Algorithmus von Floyd-Warshall Alle obigen Verfahren gehen auch mit ungerichteten Graphen (da eine ungerichtete Kante durch zwei gerichtete Kanten ersetzt werden kann), sowie für ungewichtete Graphen (allen Kanten Gewicht 1 geben). Nächstes Mal: Flüße Frank Heitmann [email protected] 137/143 Frank Heitmann [email protected] Minimale Spannbäume Kürzestes Pfade Wiederholung 138/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Literaturhinweis Problemstellung Definition (Bestimmung eines minimalen Spannbaums) Eingabe: Gegeben ein ungerichteter Graph G = (V , E ) und eine Gewichtsfunktion w : E → R+ . Gesucht: Ein Spannbaum T derart, dass X w (T ) = w (u, v ) Literatur Die letzte und die heutige Vorlesung behandeln Teile der Kapitel 22 (Elementare Graphalgorithmen), 23 (Minimale Spannbäume), 24 (Das Problem der kürzesten Pfade bei einem einzigen Startknoten) und 25 (Das Problem der kürzesten Pfade für alle Kontenpaare) aus dem [Cormen]. Insb. ist in Kapitel 24 der Beweis der Korrektheit von Dijkstras-Algorithmus zu finden. (u,v )∈E (T ) minimal ist. Mit E (T ) werden dabei die Kanten von T bezeichnet. T wird minimaler Spannbaum oder MST genannt. Ein Spannbaum von G ist ein zusammenhängender und azyklischer Teilgraph (also ein Baum) von G , der alle Knoten von G enthält. Frank Heitmann [email protected] 139/143 Frank Heitmann [email protected] 140/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Minimale Spannbäume Kürzestes Pfade Wiederholung Kruskal und Prim Problemstellung Sei A die bisher gewählte Menge von Kanten für den MST. Die Algorithmen von Kruskal und Prim arbeiten wie folgt: Definition (Problem der kürzesten Pfade) Eingabe: Gegeben ein gerichteter Graph G = (V , E ), eine Gewichtsfunktion w : E → R+ und ein Knoten s. Gesucht: Für jeden Knoten v ∈ V ein Pfad Pv , der in s beginnt, in v endet und der unter allen Pfaden mit dieser Eigenschaft das geringste Gewicht hat. Kruskal: Nimm unter allen Kanten (aus E − A) jene mit dem kleinsten Gewicht, deren Hinzufügen nicht zu einem Kreis führt. Prim: Wähle aus den Kanten eine minimale aus, die A mit einem noch isolierten Knoten von GA verbindet. Korrektheit ist kompliziert zu zeigen. Bei Prim muss zusätzlich Aufwand betrieben werden, um die Implementation als Korrekt nachzuweisen. Anmerkung Das Gewicht P eine Pfades p = [v0 , v1 , . . . , vk ] ist dabei definiert als w (p) = ki=1 w (vi−1 , vi ). Zur Laufzeit: Beide sind in O(E · log V ). Prim ist sogar in O(E + V · log V ) möglich. Frank Heitmann [email protected] 141/143 Minimale Spannbäume Kürzestes Pfade Wiederholung Kürzeste Pfade - Zusammenfassung Dijkstra. Für gewichtete, gerichtete Graphen, ohne negative Gewichte. Laufzeit: O(V 2 ) und sogar O(V · log V + E ). Bellman-Ford(-Moore). Für gewichtete, gerichtete Graphen. Negative Gewichte sind erlaubt. Laufzeit: O(V · E ). Floyd-Warshall. Für gewichtete, gerichtete Graphen. Negative Gewichte sind erlaubt. Laufzeit: O(V 3 ). Ermittelt anders als die obigen beiden kürzeste Pfade für alle Knotenpaare! Anmerkung Alle obigen Verfahren gehen auch mit ungerichteten Graphen (da eine ungerichtete Kante durch zwei gerichtete Kanten ersetzt werden kann), sowie für ungewichtete Graphen (allen Kanten Gewicht 1 geben). Frank Heitmann [email protected] 143/143 Frank Heitmann [email protected] 142/143