aktuelle Version des Vorlesungsskripts - ZIB
aktuelle Version des Vorlesungsskripts - ZIB
aktuelle Version des Vorlesungsskripts - ZIB
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
5.3 Kürzeste Wege<br />
Beweis. Nach Voraussetzung haben alle Bögen in D die Form (u, v) mit u < v. Folglich<br />
gibt es in D keinen (s, v)-Weg für v < s. Nach Definition ist die Länge eines (s, s)-Weges<br />
gleich Null. Ferner enthält jeder (s, v)-Weg mit v > s nur innere Knoten u mit s < u < v.<br />
Es gibt höchstens einen (s, s+1)-Weg, nämlich den Bogen (s, s+1), falls er in D existiert,<br />
also enthält DIST(v) für 1 ≤ v ≤ s + 1 die Länge eines kürzesten (s, v)-Weges in D.<br />
Ist v > s + 1, so folgt durch Induktion über die Schleifenindizes der Schleife 2, dass<br />
DIST(u) die Länge eines kürzesten (s, u)-Weges für 1 ≤ u ≤ v enthält. Aus formalen<br />
Gründen lassen wir Schleife 2 mit v = s + 1 beginnen. Dadurch wird kein Wert DIST(u)<br />
in Schritt 3 geändert. Für v = s + 1 ist somit nach obiger Bemerkung die Behauptung<br />
korrekt. Sei also die Behauptung für v richtig und betrachten wir den Knoten v +1. Nach<br />
Induktionsvoraussetzung enthält DIST(u), 1 ≤ u ≤ v, die Länge eines kürzesten (s, u)-<br />
Weges. Da ein (s, v + 1)-Weg entweder von s direkt nach v + 1 führt (das Gewicht dieses<br />
Bogens ist gegenwärtig in DIST(v + 1) gespeichert) oder zunächst zu Zwischenknoten u<br />
im Intervall s < u ≤ v und dann auf einen Bogen nach v + 1 führt, ist also die Länge <strong>des</strong><br />
kürzesten (s, v + 1)-Weges gegeben durch das Minimum der folgenden beiden Werte:<br />
c((s, v + 1)) = DIST(v + 1),<br />
Länge <strong>des</strong> kürzesten (s, u)-Weges + c((u, v + 1)) = DIST(u) + c((u, v + 1)).<br />
Dieses Minimum wird offenbar bei Ausführung der Schleife 3 für v + 1 berechnet. Daraus<br />
folgt die Behauptung. ✷<br />
Da das Verfahren (5.20) im wesentlichen aus zwei Schleifen besteht, die beide über<br />
maximal n − 2 Indizes laufen, ist die Laufzeit <strong>des</strong> Verfahrens O(n 2 ).<br />
Wir geben nun den MOORE-BELLMAN-Algorithmus für beliebige Digraphen in zwei<br />
verschiedenen Varianten an:<br />
(5.22) MOORE-BELLMAN-Algorithmus.<br />
Eingabe: Digraph D = (V, A), Gewichte c(a) für alle a ∈ A (können auch negativ sein),<br />
ein Knoten s ∈ V .<br />
Ausgabe: Für jeden Knoten v ∈ V ein kürzester (s, v)-Weg und seine Länge. Korrektheit<br />
<strong>des</strong> Output ist nur dann garantiert, wenn D keinen negativen Kreis enthält.<br />
Datenstrukturen: DIST(v), VOR(v) für alle v ∈ V (wie in Algorithmus (5.17))<br />
1. Setze:<br />
DIST(s) := 0<br />
DIST(v) := c((s, v)) falls (s, v) ∈ A<br />
DIST(v) := ∞ sonst<br />
VOR(v) := s ∀ v ∈ V.<br />
YEN-VARIANTE Wir nehmen hier zur Vereinfachung der Darstellung o. B. d. A. an,<br />
dass V = {1, . . . , n} und s = 1 gilt.<br />
2. DO m = 0 TO n − 2:<br />
3. Falls m gerade: DO v = 2 TO n:<br />
97