23.06.2013 Aufrufe

aktuelle Version des Vorlesungsskripts - ZIB

aktuelle Version des Vorlesungsskripts - ZIB

aktuelle Version des Vorlesungsskripts - ZIB

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!