Algorithmen und Datenstrukturen Kapitel 9 0.2cm Minimale

Werbung
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
Herunterladen