Sie sind auf Seite 1von 14

KAPITEL 2

Aufspannende Bäume und kürzeste Wege

1. Zusammenhang und Kreise


In den Grundvorlesungen werden Basisalgorithmen angegeben, die folgende
Fragen behandeln: gegeben einen Graphen G = (V, E), ist G zusammenhängend,
welche Zusammenhangskomponenten hat G, bzw. enthält G einen Kreis?
procedure depth-first-search
(1) alle Knoten v ∈ V seien unmarkiert
(2) for all v ∈ V :
(3) if v unmarkiert then search (v)
(4) endfor
item[]
(5) procedure search (v)
(6) markiere v
(7) for all u ∈ N (v) = Menge der Nachbarknoten von v
(8) if u unmarkiert then search(u)
(9) endfor

Lemma 2.1 Depth-first-search benötigt O(n + m) Schritte bei Verwendung


einer Adjazenzliste und O(n2 ) Schritte bei Verwendung einer Adjazenzmatrix. 

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.

2. Minimale aufspannende Bäume


Auch die Bestimmung eines minimal-aufspannenden Baums ist aus der Grund-
vorlesung bekannt. Der Standard-Algorithmus wählt in der Reihenfolge steigender
Gewichte Kante aus, die keine Kreise bilden ( Greedy-Verfahren“). Man kann aber

auch umgkehrt vorgehen und nach und nach die teuersten Kanten entfernen, die im
verbleibenden Graphen keine Schnittkante bilden ( worst-out-greedy“). Wir geben

im folgenden einen allgemeinen Algorithmus an, der beide Vorgehensweisen beliebig
mischt. Dazu definieren wir einen Schnitt in einem Graphen als eine Teilmenge der
Kanten der Form
δ(V1 ) = {(u, v) ∈ E | u ∈ V1 , v ∈ V r V1 }.

2.1. Ein allgemeiner spanning-tree–Algorithmus. Zur Bestimmung ei-


nes minimal aufspannenden Baumes wenden wir folgende Regeln an
B (Regel blau): Wähle einen Schnitt, der keine blaue Kante enthält. Bestim-
me die kürzeste ungefärbte Kante im Schnitt und färbe sie blau.
R (Regel rot): Wähle einen Kreis im Graphen, der keine rote Kante enthält.
Bestimme die längste ungefärbte Kante und färbe sie rot.

Der Algorithmus wendet nicht deterministisch die obigen Regeln an:


(1) Alle Kanten seien zu Beginn ungefärbt.
(2) Wende R und B an, bis alle Kanten gefärbt sind.

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

gilt ce ≤ ce′ . Dann ist T ′ := (T r e′ ) ∪ e ein minimal-aufspannender Baum, der die


Invariante erfüllt.
(b) Die Regel R wurde angewandt. Ist e ∈ / T , so hat T wiederum die Eigenschaf-
ten. Ist e ∈ T , dann sei K der gewählte Kreis. Entfernt man e aus T , so entstehen
zwei Teilbäume. K muß noch mindestens eine Kante e′ enthalten, deren Endknoten
in beiden Teilbäumen liegen. Dieses e′ ist weder rot (nach Regel R) noch blau. Nach
Wahl gilt ce ≥ ce′ und T ′ := (T r e) ∪ e′ , erfüllt die Invariante.
Angenommen, e ist noch ungefärbt. Die blauen Kanten zusammen mit den
Knoten, an denen keine blaue Kante hängt, bilden einen aufspannenden Wald.
a) Die Endknoten von e sind im gleichen Baum T , also bildet e zusammen
mit einem Pfad in T , der die Endknoten von e verbindet, einen Kreis ohne
rote Kanten ; Regel R.
b) Die Endknoten von e sind in verschiedenen Bäumen T1 und T2 ; betrachte
den Schnitt δ(T1 ), der keine blauen Kanten enthält ; Regel B.
2

2.2. Einige klassische Algorithmen. Algorithmen zur Bestimmung mini-


maler aufspannender Bäume sind unabhängig voneinander mehrfach entwickelt wor-
den.
1) Borůvka (1926)
Initialisierung: Bilde n blaue Bäume aus je einem Knoten.
Färbung: Wähle einen Baum und die zu ihm minimale inzidente Kante
und färbe diese blau (inzident: ein Knoten im Baum, einer außerhalb).
Bei gleichen Gewichten wähle die Kante mit minimalem Index!
2) Kruskal (1956)
In der Reihenfolge monoton wachsender Kantengewichte:
Färbung: Sind die Endpunkte von e im gleichen Baum (find), so färbe e
rot. Ansonsten färbe e blau und vereinige (union).
3) Prim (1957)
Wähle einen Knoten s und wiederhole n − 1 mal:
Färbung: Sei T der blaue Baum, der s enthält. Wähle eine kürzeste Kante,
die T verläßt und färbe sie blau. (Falls G nicht zusammenhängt, wähle
einen weiteren freien Knoten als Startknoten s′ und beginne von vorne!)
In der Grundvorlesung wurde gezeigt, dass sich die Variante von Prim in O(n2 )
implementieren lässt. Unter Benutzung von union-find–Datenstrukturen benotigt
Kruskal O(m log m) = O(m log n).

2.3. Minimal aufspannende Bäume als lineares Programm. Sei S ⊆


V . Mit Γ(S) bezeichnen wir die Menge {e ∈ E : e hat beide Endknoten in S}.
Betrachte Vektoren x, in der jede Komponente xe einer Kante e entspricht. Für
F ⊆ E schreiben wir dann kurz x(F ) := e∈F xe . Betrachte das folgende lineare
P
Programm:

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

Abbildung 1. Ein gerichteter Graph mit Kantengewichten

Ein Weg P von v ∈ V nach w ∈ V ist eine Folge v0 , v1 , . . . , vk von Knoten,


so daß v0 = v, vk = w und (vi , vi+1 ) ∈ E für 0 ≤ i ≤ k − 1. Der Weg hat die
Pk−1
Länge oder Kosten c(P ) := i=0 c(vi , vi+1 ). Gesucht ist ein kürzester Wege von s
zu allen anderen Knoten bzw. zu einem ausgezeichneten Zielknoten t.
Ist P ein kürzester (s, v)-Weg und u ein Knoten auf diesem Weg, so ist of-
fensichtlich das Anfangsstück von P bis zum Knoten u wiederum ein kürzester
(s, u)-Weg. Wir können daher annehmen, dass das System der kürzesten Wege zu
allen Knoten einen gerichteten Baum mit Wurzel r bildet. Wir suchen also implizit
wiederum einen – jetzt gerichteten – Baum mit bestimmten Minimalitätseigenschaf-
ten.

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

(4) dist(u) + c((u, v) ≥ dist(v) für alle (u, v) ∈ E

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.

Algorithmus von Ford

(1) dist(s) = 0, pred(s) = s


(2) dist(v) = ∞ for all v ∈ V r {s}
(3) pred(u) = nil for all v ∈ V r {s}
(4) while exists (u, v) ∈ E with dist(v) > dist(u) + c(u, v) do
(5) dist(v) = dist(u) + c(u, v)
(6) pred(v) = u
(7) end do
(8) end while

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

Wenn ein Graph negative gerichtete Kreise enthält, so kann es offensichtlich


kein zulässiges Potential geben. Wir haben soeben die Umkehrung gezeigt:

Korollar 2.7 Ein Graph besitzt genau dann ein zulässiges Potential, wenn er
keine negativen gerichteten Kreise enthält. 

3.2. Lineare Programmierung und kürzeste Wege. Die bisher gefunde-


nen Ergebnisse lassen sich im Rahmen eines Ansatzes mittels linearer Program-
mierung interpretieren. Wir schränken uns zur Vereinfachung auf die Frage ein,
zu einem gegebenen Zielknoten t einen kürzesten (s, t)-Weg zu bestimmen. Zur
Formulierung eines linearen Programms definieren wir einen Vektor b ∈ Rn mittels

 −1 v = s
bv = 1 v=t
0 sonst

Zur Lösung des kürzesten-Wege-Problems setzen wir:


P
min e∈E ce xe
(u,v)∈E x(u,v) − x(v,u) = bv für alle v ∈ V
P P
(v,u)∈E
xe ≥ 0

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

4. Kürzeste Wege in Graphen mit nichtnegativen Entfernungen


Wenn wir nur nichtnegative Gewichtsfaktoren auf den Kanten erlauben, so
hat Dijkstra gezeigt, dass sich der Ansatz von Ford weiter vereinfachen lässt. Wir
markieren dazu die Knoten schrittweise. Am Anfang seien alle Knoten unmarkiert.
Unter allen unmarkierten Knoten wählen wir einen mit minimalen dist-Wert und
markieren ihn. Ist u ein solcher aktuell markierter Knoten, so überprüfen wir die
Ungleichung (4) für alle Nachbarn v von u und schreiben deren dist-Werte ggf. fort.
Technisch setzen wir die Markierung so um, dass wir die Knoten in eine Menge
M der markierten Knoten aufnehmen. Anschaulich wächst dann schrittweise ein
22 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE

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

Sind alle Knoten markiert, so ist dist ein zulässiges Potential:


Lemma 2.11 Nach Beendigung des Verfahrens gilt dist(v) ≤ dist(u) + c(u, v) für
alle (u, v) ∈ E.
Beweis: Die Aussage gilt sicherlich unmittelbar nachdem u in M aufgenommen wur-
de. Angenommen zu einem späteren Zeitpunkt gilt sie nicht mehr. Da dist(v) nicht
wächst, muss dist(u) verringert worden sein, also später dist(u) < d(u) geworden
sein. Dies kann nur geschehen, wenn ein Knoten w in M aufgenommen wird und
dist(u) = dist(w) + c(w, u) = d(w) + c(w, u) gesetzt wird.
Nach Lemma 2.10 ist d(u) ≤ d(w). Da c(w, u) ≥ 0, folgt d(u) ≤ dist(u), im
Widerspruch zu 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

verringere: dist(v) = dist(u) + c(u, v)


füge ein: if v ∈
/ U, füge v zu U hinzu
end if
end for
end while

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

4.1. Implementierung mit Buckets. Während die eben angegeben Daten-


strukturen Bäume benutzen, lassen sich für die Verwaltung der Front auch Eimer
verwenden. Die darauf basierenden Verfahren sind nicht polynomiell, können aber
in der Praxis (in Abhängigkeit von den Daten) zu sehr kurzen Laufzeiten führen.
Diese empirisch beobachtete kurze Laufzeit lässt sich unter anderem durch die fol-
gende Beobachtung erklären.
Lemma 2.13 Sei d := min{dist(u) : u ∈ U } und C = max{c(e) : e ∈ E}. Für
alle v ∈ U gilt d ≤ dist(v) ≤ d + C.
Beweis: Induktion über die while-Schleife, wobei wir mit dk , distk , Uk die entspre-
chenden Größen vor Ausführung der k-ten Iteration bezeichnen.
Die Aussage ist offensichtlich richtig für k = 1. Sei u im Schritt k das Element mit
minimaler Distanz und v ∈ Uk . Nach Wahl von u ist dk ≤ distk (v). Ist v ∈ Uk−1 , so
gilt per Induktion , daß distk (v) ≤ distk−1 (v) ≤ dk−1 + C ≤ dk + C. Ist v ∈ / Uk−1 ,
so ist distk (v) = dk + c(u, v) ≤ dk + C. 2

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

while Eimer ((i0 + i) mod(C + 1)) = ∅ und i ≤ C do i = i + 1.


if i = C + 1
then Stop (Front ist leer)
else
das Minimum befindet sich im Eimer (i0 + i) mod(C + 1).
endif

• lösche Min: Entferne das Minimum aus seinem Eimer.


• Verringere: Entferne v aus dem Eimer Olddist(v) mod(C + 1) und füge
v in den Eimer N ewdist(v) mod(C + 1) ein.

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).

4.2. Skalierungs-Verfahren. Ein zulässiges Potential d : V → R heißt Nähe-


rungslösung, wenn für jeden Knoten v der maximal mögliche, endliche Abstand
M axdist(v) von s nach v im Intervall [d(v), d(v) + m] liegt.

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).

4.3. D’Esopo-Pape-Algorithmus. Der Ansatz von D’Esopo und Pape ver-


sucht, die zeitaufwendige Minimumssuche zu vermeiden. Dabei wird aber in Kauf
genommen werden müssen, daß ein Knoten mehrmals markiert wird.

4.4. D’Esopo-Pape-Verfahren. Input: (Di)-Graph G = (V, E), Gewichte


c(e) ∀e ∈ E, so wie Startknoten s
Output: Kürzeste Wege von s nach v ∀v ∈ V und ihre Längen.
Datenstrukturen: dist(v), V or(v) ∀v ∈ V wie gehabt.

(1) dist(s) := 0 und dist(v) = ∞, V or(v) := s ∀v ∈ V \{s}


(2) Initialisiere eine Schlange Q und setze s in Q
(3) Hole das erste Element aus der Schlange, sagen wir u
for all (u, v) ∈ E do
if dist(u) + c(u, v) < dist(v) then
dist(v) := dist(u) + c(u, v);
V or(v) = u
if v noch nicht in Q war setze v an das Ende von Q
else if v jetzt nicht in Q, setze v an den Anfang von Q
endif
endfor
If Q 6= ∅ gehe zu 3
If dist(v) < ∞, so enthält dist(v) die Länge des kürzesten (s, v) Weges
If dist(v) = ∞, so gibt es keinen (s, v)-Weg.

Lemma 2.17 Der D’Esopo-Pape Algorithmus arbeitet korrekt.


26 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE

Beweis: Für v ∈ V sei P ape(v) die vom d’Esopo-Pape-Algorithmus berechnete


Distanz. Offensichtlich gilt P ape(v) ≥ dist(v) für alle v ∈ V.
Angenommen P ape(v) > dist(v) für mindestens einen Knoten. Unter all diesen,
wähle einen mit dist(v) minimal und unter diesen wiederum einen, dessen kürzester
Weg möglichst wenige Knoten enthält. Sei v ein solcher Knoten und u der Vorgänger
von v auf einem kürzesten Weg. Per Konstruktion gilt dist(u) = P ape(u).
Zu dem Zeitpunkt, an dem u zum letzten Mal aus Q entfernt wird, muß
dist(u) = P ape(u) gelten, denn die Pape-Distanz von u bleibt danach unverändert.
Danach gilt:

P ape(v) ≤ P ape(u) + c(u, v) = dist(u) + c(u, v) = dist(v)


2

4.5. 2-Listen-Verfahren und Threshold-Verfahren. Während der d’Esopo-


Pape-Algorithmus eine nicht-polynomiell beschränkte Laufzeit hat, läßt sich die
folgende Variante durch O(n · m) beschränken.

2-Listen-Verfahren

(1) Setze dist(u) = ∞, V or(u) = ∅ ∀u ∈ V \{s, dist(s) = 0 und k = 0.


(2) Erzeuge zwei Listen (Stacks oder Queues) N EXT = ∅ N OW = {s}.
(3) Falls N OW = ∅, gehe zu 4. Andernfalls wähle u ∈ N OW.
(1)for all (u, v) ∈ E do
if dist(v) > dist(u) + c(u, v), then
dist(v) = dist(u) + c(u, v)
Vor (v) = u
If v ∈
/ N OW ∪ N EXT : füge v zu N EXT hinzu
endif
endfor
gehe zu 2.
(2) If N EXT = ∅, ST OP
Else setze N OW = N EXT, N EXT = ∅, k = k + 1 und gehe zu 2.
endif

Lemma 2.18 Sei dk = min{dist(u) : u ∈ N EXT } am Anfang von Schritt 4 in


der k-ten Iteration. Dann gilt:
(i) dk ≤ dk+1
(ii) für alle u ∈ N EXT mit dist(u) = dk ist ein kürzester Weg gefunden und u
wird nicht mehr in einer N EXT -Liste auftauchen.

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).

Beweis: In jeder Iteration werden schlimmstenfalls alle Kanten durchsucht. Da nach


obigem Lemma in jeder Iteration stets mindestens einen Knoten der kürzeste Weg
gefunden wird, kann es höchstens n Iterationen geben. 2

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.

4.6. Threshold-Algorithmus. Zusatzregel: Wähle eine Konstante K ∈ N


und modifiziere Schritt 4:

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

z.B. wähle K − 1 beliebige Knoten und einen, für den dist(u) = d.


Satz 2.20 Der Threshold-Algorithmus berechnet kürzeste Wege und hat eine Lauf-
zeit von O(n2 ).

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

4.7. Future-Cost-Verfahren. Wir haben in Lemma 2.10 gesehen, dass sich


die Front des Dijkstra-Algorithmus kreisförmig“ um den Startpunkt ausbreitet.

Sind wir lediglich daran interessiert, den kürzesten Weg zu einem vorgegebenen
Zielpunkt zu bestimmen, so markiert das Verfahren auch Knoten, die nicht auf dem
gesuchten Weg liegen. Wenn wir beispielsweise den kürzesten Weg von Köln nach
München in dem Graphen suchen, der aus dem Fernstraßennetz der Bundesrepublik
besteht, wobei die Knoten Städte, Kreuzungen oder Abzweigungen von Straßen
repräsentieren. Es genügt, den Dijkstra-Algorithmus zu stoppen, sobald der Knoten
München“ in M liegt. Allerdings wird dann immer noch z.B. Hamburg in M

aufgenommen, da es näher an Köln liegt als München. Dabei ist die Berechnung
des Weges nach Hamburg unnötig, da es offensichtlich nicht auf dem optimalen Weg
28 2. AUFSPANNENDE BÄUME UND KÜRZESTE WEGE

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.

Um den kürzesten Weg von s zu einem Zielknoten t zu finden, definieren wir:


c′ (v, w) := c(v, w) + f (w, t) − f (v, t) für alle v, w ∈ V. Wie man leicht sieht, gilt
ist diese neue Kantenbewertung nichtnegativ, denn c′ (v, w) = c(v, w) + f (w, t) −
f (v, t) ≥ f (v, w) + f (w, t) − f (v, t) ≥ 0. Weiter gilt für alle Wege P von s nach t:
c′ (P ) = c(P ) − f (s, t)

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.

Jedes zulässige Potential y liefert eine untere Schranke:

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