Kapitel V K¨ urzeste Pfade
1. Grundlegende Begriffe
Betrachte Digraph G = (V, A) oder Graph G = (V, E).
Kante im ungerichteten
Graph
entgegengesetzte (antiparallele) Kanten
r r r r
= b 6
?
Distanzfunktion: d : A −→ R + (bzw. −→ R )
O.B.d.A.: A = V × V , d(x, y) = +∞ f¨ ur Kanten, die eigentlich nicht vorhanden sind.
dis(v, w) := L¨ ange eines k¨ urzesten Pfades von v nach w
∈ R + ∪ {+∞}.
EADS 1 Grundlegende Begriffe 466/530
ľErnst W. Mayr
Arten von K¨ urzeste-Pfade-Problemen:
1
single-pair-shortest-path (spsp). Beispiel: K¨ urzeste Entfernung von M¨ unchen nach Frankfurt.
2
single-source-shortest-path: gegeben G, d und s ∈ V ,
bestimme f¨ ur alle v ∈ V die L¨ ange eines k¨ urzesten Pfades von s nach v (bzw. einen k¨ urzesten Pfad von s nach v) (sssp).
Beispiel: K¨ urzeste Entfernung von M¨ unchen nach allen anderen Großst¨ adten.
3
all-pairs-shortest-path (apsp). Beispiel: K¨ urzeste Entfernung zwischen allen Großst¨ adten.
Bemerkung: Wir kennen keinen Algorithmus, der das
single-pair-shortest-path berechnet, ohne nicht gleichzeitig (im worst-case) das single-source-shortest-path-Problem zu l¨ osen.
EADS 1 Grundlegende Begriffe 467/530
ľErnst W. Mayr
2. Das single-source-shortest-path-Problem
Zun¨ achst nehmen wir an, dass d ≥ 0 ist. Alle k¨ urzesten Pfade von a nach b sind o.B.d.A. einfache Pfade.
2.1 Dijkstra’s Algorithmus
Gegeben: G = (V, A), (A = V × V ), Distanzfunktion d : A → R + ∪ {+∞}, Startknoten s, G durch Adjazenzlisten dar- gestellt.
A A A
C C C
r
r r
r r r
r r s 0
EADS 2.1 Dijkstra’s Algorithmus 468/530
ľErnst W. Mayr
algorithm sssp:=
S := {s}; dis[s] := 0; initialisiere eine Priority Queue P Q, die alle Knoten v ∈ V \ {s} enth¨ alt mit Schl¨ ussel dis[v] := d(s, v) for alle v ∈ V − {s} do from[v] := s od
while S 6= V do
v := ExtractMin(P Q) S := S ∪ {v}
for alle w ∈ V \ S, d(v, w) < ∞ do if dis[v] + d(v, w) < dis[w] then
DecreaseKey(w, dis[v] + d(v, w)) co DecreaseKey aktualisiert dis[w] oc from[w] := v
fi od od
EADS 2.1 Dijkstra’s Algorithmus 469/530
ľErnst W. Mayr
Seien n = |V | und m = die Anzahl der wirklichen Kanten in G.
Laufzeit (mit Fibonacci-Heaps):
Initialisierung: O(n) ExtractMin: n · O(log n)
Sonstiger Aufwand: m · O(1) (z.B. DecreaseKey )
⇒ Zeitbedarf also: O(m + n log n)
EADS 2.1 Dijkstra’s Algorithmus 470/530
ľErnst W. Mayr
Korrektheit: Wir behaupten, dass in dem Moment, in dem ein v ∈ V \ {s} Ergebnis der ExtractMin Operation ist, der Wert dis[v]
des Schl¨ ussels von v gleich der L¨ ange eines k¨ urzesten Pfades von s nach v ist.
Beweis:
[durch Widerspruch] Sei v ∈ V \ {s} der erste Knoten, f¨ ur den diese Behauptung nicht stimmt, und sei
r - r - r . . . - r - r - r . . . - r r s s 1 s 2 s r v 1 v 2 v q v -
ein k¨ urzester Pfad von s nach v, mit einer L¨ ange < dis[v]. Dabei sind s 1 , . . . , s r ∈ S, v 1 ∈ / S [r = 0 und/oder q = 0 ist m¨ oglich].
Betrachte den Pfad s r - s 1 r . . . - s r r - v 1 r
; seine L¨ ange ist < dis[v], f¨ ur q ≥ 1 (ebenso f¨ ur q = 0) ist also dis[v 1 ] < dis[v], im
Widerspruch zur Wahl von v.
EADS 2.1 Dijkstra’s Algorithmus 471/530
ľErnst W. Mayr
Beispiel 108 (Dijkstra’s Algorithmus)
gegeben Graph G;
v 1 ist der Startknoten;
setze v 1 als Bezugsknoten;
setze dis[v 1 ] = 0;
setze dis[Rest] = +∞;
0
∞
∞
∞
∞
∞
∞ 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
EADS 472/530
ľErnst W. Mayr
Beispiel 108 (Dijkstra’s Algorithmus)
gegeben Graph G;
v 1 ist der Startknoten;
setze v 1 als Bezugsknoten;
setze dis[v 1 ] = 0;
setze dis[Rest] = +∞;
0
∞
∞
∞
∞
∞
∞ 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
setze dis[v 2 ] = 2;
markiere (v 1 , v 2 );
setze dis[v 3 ] = 6;
markiere (v 1 , v 3 );
setze v 2 als Bezugsknoten, da dis[v 2 ] minimal;
∞
∞
∞ 0 ∞
2 6
f
3
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
EADS 472/530
ľErnst W. Mayr
Beispiel 108 (Dijkstra’s Algorithmus)
setze dis[v 2 ] = 2;
markiere (v 1 , v 2 );
setze dis[v 3 ] = 6;
markiere (v 1 , v 3 );
setze v 2 als Bezugsknoten, da dis[v 2 ] minimal;
∞
∞
∞ 0 ∞
2 6
f
3
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
setze dis[v 3 ] = 2 + 3 = 5;
markiere (v 2 , v 3 );
unmarkiere (v 1 , v 3 );
setze dis[v 4 ] = 2 + 4 = 6;
markiere (v 2 , v 4 );
setze v 3 als Bezugsknoten, da dis[v 3 ] minimal;
∞
∞ 0 ∞
2 5
6 f
@
@
@
@
@
@
@
@
@
@
@
@ R
- 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
EADS 472/530
ľErnst W. Mayr
Beispiel 108 (Dijkstra’s Algorithmus)
setze dis[v 3 ] = 2 + 3 = 5;
markiere (v 2 , v 3 );
unmarkiere (v 1 , v 3 );
setze dis[v 4 ] = 2 + 4 = 6;
markiere (v 2 , v 4 );
setze v 3 als Bezugsknoten, da dis[v 3 ] minimal;
∞
∞ 0 ∞
2 5
6 f
@
@
@
@
@
@
@
@
@
@
@
@ R
- 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
setze dis[v 5 ] = 5 + 2 = 7;
markiere (v 3 , v 5 );
setze dis[v 6 ] = 5 + 3 = 8;
markiere (v 3 , v 6 );
setze v 4 , dann v 5
als Bezugsknoten;
0 ∞
2 5
6 7
8 f
@
@
@
@
@
@
@
@
@
@
@
@ R
- -
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
EADS 472/530
ľErnst W. Mayr
Beispiel 108 (Dijkstra’s Algorithmus)
setze dis[v 5 ] = 5 + 2 = 7;
markiere (v 3 , v 5 );
setze dis[v 6 ] = 5 + 3 = 8;
markiere (v 3 , v 6 );
setze v 4 , dann v 5
als Bezugsknoten;
0 ∞
2 5
6 7
8 f
@
@
@
@
@
@
@
@
@
@
@
@ R
- -
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
@
@
@
@
setze dis[v 7 ] := 7 + 1 = 8;
markiere (v 5 , v 7 );
alle Knoten wurden erreicht:
⇒ Algorithmus zu Ende 0
2 5
6 7
8 8 f
@
@
@
@
@
@
@
@
@
@
@
@ R
- -
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@ R
@
@
@
@
@
@
@
@
@
@
@
@ R
2 6
3
4 3
3 2
1
1 v 1
v 2
v 3
v 4
v 5
v 6
v 7 s
s s
s s
s s
EADS 2.1 Dijkstra’s Algorithmus 472/530
ľErnst W. Mayr
Beobachtung:
ExtractMin liefert eine (schwach) monoton steigende Folge von Schl¨ usseln dis[·];
Die Schl¨ ussel 6= ∞ in P Q sind stets ≤ dis[v] + C, wobei v das Ergebnis der vorangehenden ExtractMin-Operation (bzw.
s zu Beginn) und C := max (u,w)∈A {dis(u, w)} ist.
Satz 109
Dijkstra’s Algorithmus (mit Fibonacci-Heaps) l¨ ost das single-source-shortest-path-Problem in Zeit O(m + n log n).
EADS 2.1 Dijkstra’s Algorithmus 473/530
ľErnst W. Mayr
Bemerkungen:
1
Verwendet man Dijkstra’s Algorithmus mit d-Heaps, so erh¨ alt man Laufzeit
O(m log 2+
mn
n)
2
Mikkel Thorup:
Undirected single-source shortest paths with positive integer weights in linear time
J. ACM 46(3), pp. 362–394 (1999)
EADS 2.1 Dijkstra’s Algorithmus 474/530
ľErnst W. Mayr
2.2 Dijkstra’s Algorithmus mit Radix-Heaps
dis[v] dis[v 0 ]
r r r r · · · r r r
d(v) ∈ [0, . . . , C] (alle Werte sind zwischen dis[v] und nC)
dis[v] dis[v 0 ] 6 H Y H H
v v 0 +∞
s S
r r r r r r - r
EADS 2.2 Dijkstra’s Algorithmus mit Radix-Heaps 475/530
ľErnst W. Mayr
Wir verwenden Radix-Heaps (siehe dort), in der einstufigen Variante wie vorgestellt.
Satz 110
Dijkstra’s Algorithmus mit einstufigen Radix-Heaps hat Zeitkomplexit¨ at O(m + n log C).
Beweis:
siehe Satz 72.
EADS 2.2 Dijkstra’s Algorithmus mit Radix-Heaps 476/530
ľErnst W. Mayr
Verbesserungen:
1
zweistufige Heaps: O(m + n · log log log C C )
2
mehrstufige Heaps (+Fibonacci-Heaps): O(m + n √ log C)
R.K. Ahuja, Kurt Mehlhorn, J.B. Orlin, R.E. Tarjan:
Faster Algorithms for the Shortest Path Problem J.ACM 37, pp. 213–223 (1990)
EADS 2.2 Dijkstra’s Algorithmus mit Radix-Heaps 477/530
ľErnst W. Mayr
2.3 Bellman-Ford-Algorithmus Wir setzen (zun¨ achst) wiederum voraus:
d ≥ 0 .
Dieser Algorithmus ist ein Beispiel f¨ ur dynamische Programmierung.
Sei B k [i] := L¨ ange eines k¨ urzesten Pfades von s zum Knoten i, wobei der Pfad h¨ ochstens k Kanten enth¨ alt.
Gesucht ist B n−1 [i] f¨ ur i = 1, . . . , n (o.B.d.A. V = {1, . . . , n}).
EADS 2.3 Bellman-Ford-Algorithmus 478/530
ľErnst W. Mayr
Initialisierung:
B 1 [i] :=
d(s, i) , falls d(s, i) < ∞, i 6= s 0 , falls i = s
+∞ , sonst Iteration:
for k := 2 to n − 1 do for i := 1 to n do
B k [i] :=
0 , falls i = s
min j∈N
−1(i) {B k−1 [i], B k−1 [j] + d(j, i)} , sonst od
od
Bemerkung: N −1 (i) ist die Menge der Knoten, von denen aus eine Kante zu Knoten i f¨ uhrt.
EADS 2.3 Bellman-Ford-Algorithmus 479/530
ľErnst W. Mayr
Korrekheit:
klar (Beweis durch vollst¨ andige Induktion) Zeitbedarf:
Man beachte, dass in jedem Durchlauf der ¨ außeren Schleife jede Halbkante einmal ber¨ uhrt wird.
Satz 111
Der Zeitbedarf des Bellman-Ford-Algorithmus ist O(n · m).
Beweis:
s.o.
EADS 2.3 Bellman-Ford-Algorithmus 480/530
ľErnst W. Mayr
3. Floyd’s Algorithmus f¨ ur das all-pairs-shortest-path-Problem Dieser Algorithmus wird auch als
” Kleene’s Algorithmus“
bezeichnet. Er ist ein weiteres Beispiel f¨ ur dynamische Programmierung.
Sei G = (V, E) mit Distanzfunktion d : A → R + 0 gegeben. Sei o.B.d.A. V = {v 1 , . . . , v n }.
Wir setzen nun
c k ij := L¨ ange eines k¨ urzesten Pfades von v i nach v j , der als innere Knoten (alle bis auf ersten und letzten Knoten) nur Knoten aus {v 1 , . . . , v k } enth¨ alt.
EADS 3.0 Bellman-Ford-Algorithmus 481/530
ľErnst W. Mayr
algorithm floyd :=
for alle (i, j) do c (0) ij := d(i, j) od co 1 ≤ i, j ≤ n oc for k := 1 to n do
for alle (i, j), 1 ≤ i, j ≤ n do c (k) ij := min
n
c (k−1) ij , c (k−1) ik + c (k−1) kj o od
od
EADS 3.0 Bellman-Ford-Algorithmus 482/530
ľErnst W. Mayr
Laufzeit: O(n 3 ) Korrektheit:
Zu zeigen: c (k) ij des Algorithmus = c k ij (damit sind die L¨ angen der k¨ urzesten Pfade durch c (n) ij gegeben).
Beweis:
Richtig f¨ ur k = 0. Induktionsschluss: Ein k¨ urzester Pfad von v i
nach v j mit inneren Knoten ∈ {v 1 , . . . , v k+1 } enth¨ alt entweder v k+1 gar nicht als inneren Knoten, oder er enth¨ alt v k+1 genau einmal als inneren Knoten. Im ersten Fall wurde dieser Pfad also bereits f¨ ur c (k) ij betrachtet, hat also L¨ ange = c (k) ij . Im zweiten Fall setzt er sich aus einem k¨ urzesten Pfad P 1 von v i nach v k+1 und einem k¨ urzesten Pfad P 2 von v k+1 nach v j zusammen, wobei alle inneren Knoten von P 1 und P 2 ∈ {v 1 , . . . , v k } sind. Also ist die L¨ ange des Pfades = c (k) i,k+1 + c (k) k+1,j .
EADS 3.0 Bellman-Ford-Algorithmus 483/530
ľErnst W. Mayr
Satz 112
Floyd’s Algorithmus f¨ ur das all-pairs-shortest-path-Problem hat Zeitkomplexit¨ at O(n 3 ).
EADS 3.0 Bellman-Ford-Algorithmus 484/530
ľErnst W. Mayr