Beruflich Dokumente
Kultur Dokumente
Nach einem Aufruf von search(v) aus dem Hauptprogramm ist die Zusammen-
hangskomponente von v markiert. Wenn die Zeile (8) durch:
(8’) if u unmarkiert T := T ∪ {(v, u)}; search(u)
ersetzt wird, so liefert T einen aufspannenden Baum bzw. Wald“, falls G nicht
”
zusammenhängend ist. Wenn die Zeile:
if u markiert then B := B ∪ {(v, u)}
eingefügt wird, so enthält G genau dann einen Kreis, wenn B 6= ∅. Eine nicht-
rekursive Version von search(v) lautet:
(1) push (v)
(2) repeat
(3) u := pop
(4) markiere u
(5) for all w ∈ N (u)
(6) if w unmarkiert then push(w)
15
16 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE
(7) endfor
(8) until stack = ∅
Wenn der Stack durch eine Queue ersetzt wird, so wird der Graph zuerst in der
Breite durchmustert (breadth-first-search). Wir können dem Verfahren einen
Zähler mitgeben, der jedem Knoten seinen Abstand vom Startknoten zuordnet.
Satz 2.2 Sei G ein zusammenhängender Graph. Dann färbt der allgemeine spanning-
tree-Algorithmus alle Kanten, und die blauen Kanten bilden einen minimalen auf-
spannenden Baum.
Beweis: Wir zeigen induktiv die folgende Invariante: Es gibt einen minimalen auf-
”
spannenden Baum, der alle blauen und keine roten Kanten enthält“. Da zu Beginn
der Graph ungefärbt ist, ist die Aussage offensichtlich richtig bevor die erste Kante
gefärbt wird.
Sei T der vor dem aktuellen Schritt existierende minimal-aufspannende Baum
mit den geforderten Eigenschaften und sei e die aktuelle gefärbte Kante. Wir un-
terscheiden zwei Fälle.
(a) Die Regel B wurde angewandt. Ist e ∈ T , so hat T nach wie vor die
Eigenschaften. Ist e ∈/ T , dann sei δ(U ) der Schnitt, der keine blauen Kanten
enthalten hat. Es gibt eine ungefärbte Kante e′ ∈ T ∩ δ(U ) und nach Wahl von e
2. MINIMALE AUFSPANNENDE BÄUME 17
min cx
x(Γ(S)) ≤ |S| − 1 für alle S, ∅ 6= S ( V
x(E) = |V | − 1
xe ≥ 0 für alle e ∈ E.
18 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE
Offensichtlich liefert das obige LP eine untere Schranke für die Größe eines
minimal aufspannenden Baums. Wir werden in einem späteren Kapitel in einem
allgemeineren Rahmen zeigen, dass diese Schranke scharf ist:
Satz 2.3 Sei x∗ der Inzidenzvektor eines minimal aufspannenden Baums. Dann
liefert x∗ eine Optimallösung für das obige lineare Programm.
Dabei ist zu beachten, dass das lineare Programm eine sehr große Anzahl von
Ungleichungen enthält, genauer expontiell viele in der Anzahl der Knoten. Wir lösen
damit in polynomieller Zeit ein lineares Problem mit exponentiell vielen Restrik-
tionen. Dies kann nur funktionieren, wenn wir die Nebenbedingungen nicht explizit
berücksichtigen.
3. Kürzeste Wege
Gegeben sei ein gerichteter Graph D = (V, E) mit Knotenmenge V , Kanten-
menge E und Kantengewichten c(v, w) für (v, w) ∈ E. Im Gegensatz zur Grundvor-
lesung erlauben wir allgemeine Kosten oder Entfernungen c(v, w) ∈ R. Zusätzlich
sei ein Knoten s ∈ V ausgezeichnet.
10 9
s 2
t
14
7
3.1. Potentiale und der Algorithmus von Ford. Angenommen für jeden
Knoten v ∈ V kennen wir eine Zahl dist(v), mit der Eigenschaft, dass es in G einen
(s, v)-Weg der Länge dist(v) gibt. Wenn dann für eine Kante (u, v) gelten würde,
dass dist(u) + c(u, v) < dist(v), so wüssten wir, dass es einen kürzeren (s, v)-Weg
über u gibt, und wir könnten dist(v) verringern. Sind die dist(v) insbesondere die
Längen von kürzesten Wegen, so muss gelten:
3. KÜRZESTE WEGE 19
Eine Knotenbewertung dist(v) für alle v ∈ V , für die die Ungleichung (4) und
dist(s) = 0 gilt, heißt zulässiges Potential. Zulässige Potentiale und die Längen
kürzester Wege erfüllen eine schwache Dualität:
Lemma 2.4 Sei dist ein zulässiges Potential und P ein (s, v)-Weg. Dann gilt
c(P ) ≥ dist(v).
Beweis: Sei P von der Form s = v0 , v1 , . . . , vk = v. Dann folgt unter Berücksichti-
gung von (4):
k−1
X k−1
X
c(P ) = c(vi , vi+1 ) ≥ dist(vi+1 ) − dist(vi ) = dist(vk ) − dist(v0 ) = dist(v).
i=0 i=0
2
Auf diesen Beobachtunge beruht der Algorithmus von Ford. Wir verwenden
zwei Datenstrukturen dist(u), pred(u) für die Knoten u ∈ V . In dist(u) speichern
wir jeweils die Länge des kürzesten bisher gefundenenen Weges und pred(u) ist der
Vorgänger auf diesem Weg. Wir initialisieren dist mit dist(v) = ∞ für v ∈ V r s
und dist(s) = 0 und suchen iterativ nach Kanten (u, v), die die Bedingung (4)
verletzen.
An Beispielen macht man sich schnell klar, dass der Algorithmus nicht abbricht,
wenn G einen negativen gerichteten Kreis enthält, das heißt einen gerichteten Kreis,
in dem die Summe der Kantengewichte negativ ist. In einem solchen Fall existieren
aber auch Knoten, für die es keinen kürzesten Weg gibt. Wir wollen zeigen, dass
diese Situation aber auch die einzige ist, in denen der Algorithmus nicht terminiert.
Offensichtlich ist dist(v) 6= ∞ genau dann, wenn pred(v) 6= nil. Weiter gilt per
Induktion, dass, wenn dist(v) 6= ∞, die Zeiger pred(v) einen (s, v)-Weg der Länge
dist(v) bilden.
Lemma 2.5 Wenn G keinen negativen gerichteten Kreis enthält, so gilt in je-
dem Schritt des Algorithmus von Ford die folgende Invariante: ist dist(v) 6= ∞, so
enthält G einen einfachen (s, v)-Weg der Länge dist(v).
20 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE
Beweis: Sei distj (v) der Wert von dist(v) nach j Iterationen. Angenommen, die
Aussage ist falsch. Das heißt distj (v) 6= ∞, aber der zugehörige gerichtete Weg
enthält einen Kreis v0 , v1 , . . . , vk mit v0 = vk . Zu jedem Knoten in diesem Kreis
gibt es Iterationen j0 < j1 < . . . < jk , in denen
distji−1 (vi−1 ) + c(vi−1 , vi ) = distji (vi )
gesetzt wurde. Die Kosten entlang dieses Kreises betragen
k
X k
X
c(vi−1 , vi ) = [distji (vi ) − distji−1 (vi−1 )] = distjk (vk ) − distj0 (v0 ).
i=1 i=1
Da aber in der Iteration jk der Distanzwert von vk verringert wurde (d.h. distjk (vk ) <
distj0 (v0 )), hat der Kreis eine negative Länge, im Widerspruch zur Voraussetzung.
2
Satz 2.6 Wenn G keinen negativen gerichteten Kreis enthält, so bricht der Ford-
Algorithmus nach einer endlichen Anzahl von Schritten ab. Für alle v ∈ V indu-
zieren dann die pred(v) einen kürzesten (s, v)-Weg mit Länge dist(v).
Beweis: Da G nur eine endliche Anzahl von einfachen Wegen enthält, kann jedes
dist(v) nur endlich viele verschiedene Werte annehmen. Da in jeder Iteration einer
dieser Werte sinkt und alle anderen nicht steigen, bricht der Algorithmus nach
endlich vielen Schritten ab. Da am Ende dist(v) ein zulässiges Potential ist, und
die berechneten Wege eine Länge von höchstens dist(v) haben, folgt die Minimalität
aus der schwachen Dualität in Lemma 2.4. 2
Korollar 2.7 Ein Graph besitzt genau dann ein zulässiges Potential, wenn er
keine negativen gerichteten Kreise enthält.
Jeder Inzidenzvektor eines (s, t)-Weges liefert eine zulässige Lösung dieses Pro-
blems. Das dual Programm lautet
4. KÜRZESTE WEGE IN GRAPHEN MIT NICHTNEGATIVEN ENTFERNUNGEN 21
max yt − ys
yv − yu ≤ c(u, v)
und hat als zulässige Lösungen gerade die zulässigen Potentiale. Die Restrik-
tionsmatrix des primalen Programms ist die Knoten-Kanten-Inzidenz-Matrix des
gerichteten Graphen. Die vorher hergeleiteten Aussagen stellen somit einen Spezi-
alfall der Dualität der linearen Programmierung über total unimodularen Matrizen
dar.
3.3. Das Verfahren von Bellman und Ford. Wir haben zwar eine Schran-
ke für die Laufzeit angegeben, die jedoch keine polynomielle Laufzeit garantiert. Die
folgende Variante des Ford-Algorithmus beruht auf dynamischer Programmierung.
Sei dazu distk (v) die Länge eines kürzesten Weges von s nach v, der maximal k
Kanten benutzt. Wir setzen distk (v) = ∞, wenn kein solcher Weg existiert. Dann
ist distn−1 (t) die Länge eines kürzesten (s, t)-Weges. Wir lassen das Verfahren aus
Gründen, die weiter unten klar werden, aber bis n laufen.
Wir starten mit dist0 (s) = 0 und dist0 (v) = ∞ für alle v ∈ V r s. Für k =
1, . . . , n und v ∈ V r s setzen wir
distk+1 (v) = min{distk (v), distk (u) + c(u, v) : (u, v) ∈ E}.
Dann ergibt sich unmittelbar:
Satz 2.8 Sei G = (V, E) ein gerichteter Graph ohne negative Kreise. Dann be-
rechnet der Algorithmus von Bellman-Ford kürzeste Wege in O(mn) Schritten.
Der Bellman-Ford-Algorithmus kann auch benützt werden, um einen negativen
Kreis zu entdecken.
Satz 2.9 Sei D = (V, A) ein gerichteter Graph mit einer allgemeinen Kantenbe-
wertung. Dann kann in O(mn) Schritten ein von s aus erreichbarer negativer Kreis
gefunden werden, wenn ein solcher existiert.
Beweis: Sei distn−1 (u) 6= distn (u) für ein u ∈ V . Dann ist distn (u) < distn−1 (u)
und es existiert ein (s, u)-Pfad P der n Kanten benutzt. Daher muss P einen Kreis
C enthalten. Wenn wir C aus P entfernen, erhalten wir einen (s, u)-Pfad P ′ der
weniger als n Kanten benützt. Dann folgt c(P ′ ) ≥ distn−1 (u) > distn (u) = c(P )
und somit c(C) < 0.
Ist distn−1 (u) = distn (u) für alle u ∈ V , so kann kein negativer Kreis existieren,
der von s aus erreicht werden kann. 2
Kreis“ um den Startpunkt, in dem die Knoten von M liegen. Etwas formaler:
”
wenn wir mit d(u) den Wert von dist(u) zum Zeitpunkt der Aufnahme von u in M
bezeichnen, so gilt:
Lemma 2.10 Wenn u vor v in M aufgenommen wird, so ist d(u) ≤ d(v).
Beweis: Angenommen es existiert ein Knoten v, so dass ein anderer Knoten u vor
v in M aufgenommen wird, aber d(u) > d(v) gilt. Unter all diesen Knoten wähle
dasjenige v, das als erstes in M aufgenommen wird. Wenn u in M aufgenommen
wird, ist d(u) = dist(u) ≤ dist(v) nach Konstruktion.
Da d(u) nicht mehr verändert wird, muss dist(v) später verringert worden sein.
Dies kann aber nur passieren, wenn ein Knoten in M aufgenommen und der dist-
Wert von v herabgesetzt wird. Sei w der letzte solche Knoten. Dann gilt dist(v) =
dist(w) + c(w, v) und, da beide Werte nicht mehr verändert werden, auch d(v) =
d(w) + c(w, v). Nach Wahl von v ist d(u) ≤ d(w). Da c(w, v) ≥ 0, folgt d(v) =
d(w) + c(w, v) ≥ d(u), im Widerspruch zur Annahme. 2
Da die Aussagen des Lemmas 2.5 und des Satzes 2.6 auch für die Modifikation
des Ford-Algorithmus’ durch Dijkstra gelten, haben wir gezeigt, dass das Dijkstra-
Verfahren kürzeste Wege berechnet. Wir haben im letzten Lemma insbesondere
gezeigt, dass sich die Distanzwerte nicht mehr ändern, sobald ein Knoten in M
aufgenommen worden ist. Daher können wir uns im update-Schritt der dist-Werte
auf die Knoten außerhalb von M beschränken. Es reicht daher, statt der Menge
M die Menge U = {v ∈ V : dist(v) < ∞, v ∈ / M } zu betrachten, die als Front
bezeichnet wird.
Dijkstra-Algorithmus
dist(s) = 0, U = ∅
for u ∈ V mit (s, v) ∈ E do
dist(v) = c(s, v)
U = U ∪ {v}
end for
while U 6= ∅
finde Min : wähle u ∈ U mit dist(u) minimal
lösche Min: entferne u aus U
for all (u, v) ∈ E
if dist(u) + c(u, v) < dist(v) then
4. KÜRZESTE WEGE IN GRAPHEN MIT NICHTNEGATIVEN ENTFERNUNGEN 23
Wenn man die Laufzeit des Verfahrens analysiert, so ergibt sich, dass sie im
wesentlichen von den Zeiten abhängt, die benötigt werden, um die Menge U zu
verwalten.
Lemma 2.12 Die Laufzeit des Dijkstra-Algorithmus ist
O (n · max{ O(finde Min), O(lösche Min), O(füge ein) }) + m· O(verringere).
Beweis: Die while-Schleife kann höchstens n-mal ausgeführt werden, da jeder Kno-
ten höchstens einmal als Minimum auftreten kann. Die darin enthaltene for-Schleife
kann aber auch nur einmal pro Kante durchlaufen werden. 2
Der Dijkstra-Algorithmus kann so implementiert werden, dass er eine Laufzeit
hat von
(i) O(m log n) (a, 2a)-Bäume
(ii) O(m + n log n) Fibonacci-Heaps
Wir müssen daher nicht für jeden auftretenden Wert von dist einen Eimer ein-
richten. Es reicht, die Menge U in C doppelt-verketteten Listen Eimer(0), . . . , Eimer(C)
zu verwalten, wobei die Liste Eimer(k) alle Knoten v ∈ U enthält, für die gilt
dist(v) mod(C + 1) = k. Zusätzlich benutzen wir Zeiger, die von jedem v auf das-
jenige Listenelement der Liste der Eimer zeigt, das v enthält. Die Datenzugriffe
lassen sich dann wie folgt umsetzen
• füge ein: füge v in den Eimer dist(v) mod(C + 1) ein.
• Finde Min: sei i0 die Nummer des Eimers, der das letzte Minimum
enthielt
i=0
24 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE
Lemma 2.14 Die Laufzeit des Dijkstra-Algorithmus mit Buckets beträgt O(n ·
|C| + m)
Beweis: Füge-ein, Verringere und Lösche-Min können auf doppelt verketteten Li-
sten in O(1) ausgeführt werden. Die Schleife in Finde-Min wird maximal C mal
durchlaufen, also ist Finde-Min in O(|C|) und die Behauptung folgt mit Lemma
2.12 2
Der Bucket-Ansatz lässt sich verbessern, indem die Eimer nicht mehr nur einen
Wert sondern ein Intervall von Werten aufnehmen können. Bei den redistributive
”
heaps“ wird der Bereich [0, C] mit O(log C) Intervallen überdeckt, wobei die Größe
eines Intervalls sich jeweils gegenüber der seines Vorgängerintervalls verdoppelt.
Dieser Ansatz führt zu einem Verfahren mit einer Laufzeit von O(m + n log C).
Lemma 2.15 Gegeben eine Näherungslösung d(v), so läßt sich in O(m) Schritten
eine exakte Lösung berechnen.
Beweis: Setze c′ (u, v) = d(u)+c(u, v)−d(v). Es ist c′ (u, v) ≥ 0. Seien dist′ (u) die im
Dijkstra-Verfahren berechneten Distanzen bzgl. der Entfernungen c′ . Offensichtlich
unterscheidet sich die Länge eines (s, u)-Weges bzgl. c′ von der Länge dieses (s, u)-
Weges bzgl. c nur um die Konstante d(u). Es gilt also stets dist′ (u) = dist(u)−d(u).
Da d eine Näherungslösung ist, folgt dist′ (u) ≤ m. Daher läßt sich in O(m) Schrit-
ten mit Hilfe eines Eimerverfahrens bei dem für jede mögliche Distanz ein Eimer
zur Verfügung gestellt wird, mit m Eimern eine Optimallösung bzgl. c′ berechnen.
2
Die folgende Aussage beschreibt, wie man eine Näherungslösung finden kann.
Sie liefert gleichzeitig die Grundlage für ein rekursives Verfahren.
Lemma 2.16 Sei d(v) die doppelte Distanz von s nach v bzgl. der Kantenbewer-
tung c′ (u, v) = ⌊c(u, v)/2⌋. Dann ist d(v) eine Näherungslösung bzgl. c(u, v).
4. KÜRZESTE WEGE IN GRAPHEN MIT NICHTNEGATIVEN ENTFERNUNGEN 25
Beweis: Die Bewertung d ist ein zulässiges Potential, denn offensichtlich ist d(s) = 0
und nach Beendigung des Dijkstra-Verfahrens gilt:
c(u, v)
dist′ (u) + c′ (u, v) ≥ dist′ (v) ⇒ dist′ (u) + ⌊ ⌋ ≥ dist′ (v)
2
c(u, v)
⇒ dist′ (u) + ≥ dist′ (v)
2
⇒ 2 ∗ dist′ (u) + c(u, v) ≥ 2 ∗ dist′ (v)
⇒ d(u) + c(u, v) ≥ d(v)
c cij
Schließlich folgt aus 2⌊ 2ij ⌋ ≤ cij ≤ 2⌊ 2 ⌋ + 1, dass d(v) = 2 ∗ dist′ (v) ≤
dist(v) ≤ 2 ∗ dist′ (v) + m = d(v) + m. 2
Skalierungsalgorithmus
(1) Ist c(u, v) ≤ m
n ∀(u, v) ∈ E, so verwende Eimer-Verfahren.
(2) andernfalls berechne für alle v ∈ V rekursiv die Distanzen von s nach v
bzgl. ⌊c(u, v)/2⌋ und die Näherungslösung d(v).
(3) Berechne aus der Näherungslösung d(v) die Distanz dist(v) bzgl. c(u, v).
Mit C = max{cij , (ij) ∈ E} ergibt sich für das Skalierungsverfahren eine Lauf-
zeit von O(m log C).
2-Listen-Verfahren
Beweis: (i) Jeder Knoten in der N EXT -Liste der Iteration k + 1 hat einen direkten
Vorgänger aus der N EXT -Liste zum Zeitpunkt k. Da cij ≥ 0, folgt dk ≤ dk+1 .
(ii) folgt aus (i), da ein solcher Knoten nicht in N OW aufgenommen wird. 2
4. KÜRZESTE WEGE IN GRAPHEN MIT NICHTNEGATIVEN ENTFERNUNGEN 27
Satz 2.19 Der 2-Listen-Algorithmus berechnet die Länge der kürzesten Wege und
hat eine Laufzeit von O(n · m).
Das Lemma und der obige Satz benötigen lediglich die Tatsache, daß mindestens
einer der Knoten u mit dist(u) = dk von N EXT nach N OW geschoben wird. Es
muß also nicht die gesamte Liste übernommen werden.
If N EXT = ∅, STOP
else
setze K Knoten aus N EXT nach N OW , die mindestens einen
Knoten u enthalten, für den dist(u) = d.
k =k+1
gehe zu 2
endif
Beweis: Die Korrektheit folgt aus den obigen Bemerkungen. Die Liste N OW enthält
höchstens K Knoten, von denen höchstens K(n− 1) Kanten ausgehen. D.h. in jeder
Iteration sind höchstens O(n) Kanten zu benutzen. 2
von Köln nach München liegt. Allein die Luftlinien-Entfernung zwischen Hamburg
und München ist länger als der Weg von Köln nach München und bekanntlich ist
kein Weg über Straßen kürzer als die Luftlinie.
Die Idee ist nun, solche leicht berechenbaren unteren Schranken (wie hier die
Luftlinie zwischen den Städten) zur Vermeidung unnötiger Berechnungen zu nutzen.
Sei dazu f : V × V → R+ 0 eine Funktion mit f (v, v) = 0 für alle v ∈ V und
f (v, w) + f (w, x) ≥ f (v, x) für alle v, w, x ∈ V . Weiter soll gelten, dass für alle
u, v ∈ V die Zahl f (v, w) eine untere Schranke für die Länge des kürzesten Weges
von v nach w ist.
Der kürzeste Weg von s nach t bzgl. c entspricht also dem kürzesten Weg bzgl.
c′ . Damit ist es zulässig, den Algorithmus bzgl. der Kosten c′ laufen zu lassen.
Entsprechend gilt für alle Knoten u ∈ V, dist′ (u) = dist(u) − f (s, t) + f (u, t).
Das bedeutet, daß die untere Schranke für die restliche Entfernung f (u, t) auf die
Kosten dist(u) addiert wird und so Knoten mit großer Entfernung zu t vermieden
werden können. Je schärfer die untere Schranke f ist, desto effektiver arbeitet das
Verfahren.
Lemma 2.21 Sei y ein zulässiges Potential. Dann liefert f (v, w) = yv − yw eine
untere Schranke für die Länge des kürzesten (v, w)-Weges.
Beweis: Die Dreiecksungleichung gilt offensichtlich. Die zweite Aussage ergibt sich
wie die schwache Dualität. Sei P = u0 , u1 , . . . , uk mit u0 = v, uk = w ein kürzester
(v, w)-Weg. Es ist
k−1
X k−1
X
c(P ) = c(ui , ui+1 ) ≥ yui − yui+1 = yu0 − yuk = yv − yw .
i=0 i=0
2