8.4 Digraphen mit negativen Kantengewichten 8.4.1 Grunds¨ atzliches
Betrachte Startknoten s und einen Kreis C mit Gesamtl¨ ange < 0.
t t t t
t t
t t
- - ppppppppp - t J
J
J J ^ -
Q Q Q Q Q k
+ -
s
k 0
k 1 k 2
k 3 k 4
1 3 2 v
1
1 1
−5 1 C
Sollte ein Pfad von s nach C und von C nach v existieren, so ist ein k¨ urzester Pfad von s nach v nicht definiert.
ADS-EI 8.4 Digraphen mit negativen Kantengewichten 441/451
ľErnst W. Mayr
Falls aber die Gesamtl¨ ange des Kreises C ≥ 0 ist,
t t t t
t t
t t
- - ppppppppp - t J
J
J J ^ -
Q Q Q Q Q k
+ -
s
k 0
k 1 k 2
k 3 k 4
1 3 2 v
1
1 1
−3 1
dann ist der k¨ urzeste Pfad (der dann o.B.d.A. als kreisfrei
genommen werden kann) wohldefiniert. Probleme gibt es also nur
dann, wenn G einen Zyklus negativer L¨ ange enth¨ alt.
Dijkstra’s Algorithmus funktioniert bei negativen Kantenl¨ angen nicht:
s
s
s
-
@
@
@
@ @ I
s v
w
3 −2
4
Bei diesem Beispielgraphen (der nicht einmal einen negativen Kreis enth¨ alt) berechnet der Dijkstra-Algorithmus die minimale
Entfernung von s nach w f¨ alschlicherweise als 3 (statt 2).
ADS-EI 8.4 Digraphen mit negativen Kantengewichten 443/451
ľErnst W. Mayr
8.4.2 Modifikation des Bellman-Ford-Algorithmus
B k [i] gibt die L¨ ange eines k¨ urzesten gerichteten s-i-Pfades an, der aus h¨ ochstens k Kanten besteht. Jeder Pfad, der keinen Kreis enth¨ alt, besteht aus maximal n − 1 Kanten. In einem Graphen ohne negative Kreise gilt daher:
∀i ∈ V : B n [i] = B n−1 [i]
Gibt es hingegen einen (von s aus erreichbaren) Kreis negativer L¨ ange, so gibt es einen Knoten i ∈ V , bei dem ein Pfad aus n Kanten mit der L¨ ange B n [i] diesen Kreis h¨ aufiger durchl¨ auft als jeder Pfad aus maximal n − 1 Kanten der L¨ ange B n−1 [i].
Demnach gilt in diesem Fall:
B n [i] < B n−1 [i]
Man kann also in den Algorithmus von Bellman-Ford einen Test auf negative Kreise einbauen, indem man auch f¨ ur alle i ∈ V B n [i]
berechnet und am Ende den folgenden Befehl einf¨ ugt:
for i := 1 to n do
if B n [i] < B n−1 [i] then stop
” Negativer Kreis“ fi
ADS-EI 8.4 Digraphen mit negativen Kantengewichten 445/451
ľErnst W. Mayr
8.4.3 Modifikation des Floyd-Algorithmus
Falls kein negativer Kreis existiert, funktioniert der Algorithmus weiterhin korrekt.
t
t
t
t t
t
* H H
H H H j
? H H H H H Y 6 v 1
v 2
v 3
v 4 v 5
v 6
1 1
1 1 1
−6
c 6 16 = 5 = c 5 16 c 6 61 = −6 = c 5 61
c 6 11 = min{c 5 11 , c 5 16 +c 5 61 } = −1
⇒ der Graph enth¨ alt einen negativen Kreis, gdw ein c n ii < 0
existiert.
Man kann also in den Algorithmus von Floyd einen Test auf negative Kreise einbauen, indem man am Ende den folgenden Befehl einf¨ ugt:
for i := 1 to n do if c n ii < 0 then stop
” Negativer Kreis“ fi
ADS-EI 8.4 Digraphen mit negativen Kantengewichten 447/451
ľErnst W. Mayr
8.4.4 Der Algorithmus von Johnson Definition 197
Sei d : A → R ∪ {+∞} eine Distanzfunktion. Eine Abbildung r : V → R
heißt Rekalibrierung, falls gilt:
(∀(u, v) ∈ A)[r(u) + d(u, v) ≥ r(v)]
Beobachtung: Sei r eine Rekalibrierung (f¨ ur d). Setze d 0 (u, v) := d(u, v) + r(u) − r(v). Dann gilt:
d 0 (u, v) ≥ 0
Sei u = v 0 → · · · → v k = v ein Pfad. Dann ist:
d-L¨ ange :=
k−1
X
i=0
d(v i , v i+1 ) Demnach ist:
d 0 -L¨ ange =
k−1
X
i=0
d 0 (v i , v i+1 )
=
k−1
X
i=0
(d(v i , v i+1 ) + r(v i ) − r(v i+1 ))
=
k−1
X
i=0
d(v i , v i+1 ) + r(v 0 ) − r(v k )
Also ist ein d-k¨ urzester Pfad von u (= v 0 ) nach v (= v k ) auch ein d 0 -k¨ urzester Pfad und umgekehrt. Nach einer Rekalibrierung kann man also auch die Algorithmen anwenden, die eine nichtnegative Distanzfunktion d voraussetzen (z.B. Dijkstra).
ADS-EI 8.4 Digraphen mit negativen Kantengewichten 449/451
ľErnst W. Mayr
Berechnung einer Rekalibrierung:
~
z
~ 0
0 0 s
s
s
' s
&
$
% s
u
v w
Graph G
d:A→R∪ {+∞}
F¨ uge einen neuen Knoten s hin- zu und verbinde s mit jedem an- deren Knoten v ∈ V durch eine Kante der L¨ ange 0.
Berechne sssp von s nach allen anderen Knoten v ∈ V (z.B. mit Bellman-Ford). Sei r(v) die dadurch berechnete Entfernung von s zu v ∈ V . Dann ist r eine Rekalibrierung, denn es gilt:
r(u) + d(u, v) ≥ r(v) .
8.5 Zusammenfassung
d ≥ 0 d allgemein
sssp D (Fibonacci): O(m + n · log n) B-F: O(n · m)
apsp D: O(nm + n
2log n) J: O(n · m + n
2log n)
F: O(n
3)
(∗)F: O(n
3)
Bemerkung (∗) : In der Praxis ist der Floyd-Algorithmus f¨ ur kleine n besser als Dijkstra’s Algorithmus.
ADS-EI 8.5 Zusammenfassung 451/451
ľErnst W. Mayr