2.4 Algorithmus von Dinic 5. Dezember 2016 Algorithmus 2.4.1: Gegeben: zulässiger s − t Fluss in D = (V , E ) bezüglich `ij , cij . (1) Konstruktion eines Hilfsgraphen Df (Schichtgraph). (1.1) Berechne alle nützlichen Kanten mit (i, j) mit xij < cij und (j, i) xij > `ij . (1.2) Bestimme im Graphen der nützlichen Kanten die Entfernungen s zu j ) j = 1, . . . , n. Berechne `.te Schichten V` = {j ∈ V |uj = `} für alle ` = 0, 1, . . .. V (Df ) = V (D) und E (Df ) besteht aus allen nützlichen uj (d.h. Anzahl der Kanten im kürzesten Weg von für alle (1.3) (1.4) Kanten zwischen zwei aufeinanderfolgenden Schichten (d.h. von (1.5) Ist t nach V`+1 ) . nicht erreichbar (d.h. V` t 6∈ ∪` V` ), so ist der Fluss f maximal und breche Algorithmus ab. Ansonsten setze `¯ij = 0 und c̄ij = cij − xij falls xij < cij bzw. c̄ji = xij − `ij falls xij > `ij . Fortsetzung Algorithmus 2.4.1: (2) Suche in Df einen zulässigen Fluss f¯, der in jedem s − t Weg eine Kante saturiert (sättigt); d.h. für jeden Weg W in Df existiert eine Kante (i, j) auf W mit x̄ij = c̄ij . (Details von Schritt (2) kommen später). Beachte: f¯ ist i.a. kein maximaler Fluss. (3) Erhöhe f um f¯; d.h. setze f (e) = f (e) + f¯(e) für Vorwärtskante und f (e) = f (e) − f¯(e − ) für Rückwärtskante. (4) Gehe zu (1). Beispiel 2.4.2: Fortsetzung zum Beispiel: Denition 2.4.3: Eine Phase im Algorithmus 2.4.1 sei eine Durchführung der Schritte (1) − (3). Lemma 2.4.4: Die Länge des Schichtgraphen (d.h. die Anzahl der Schichten) wächst in jeder Phase um mindestens 1 (bis auf die letzte Phase). D.h. es gibt maximal n Phasen. Beweisidee: In jedem Weg in Df wird eine Kante gesättigt. Diese fehlen im nächsten Schritt als nützliche Kanten. Es können aber nützliche Rückwärtskanten hinzukommen. Bzgl. der Schichten laufen diese im Graphen der nützlichen Kanten in Rückwärtsrichtung. (Details siehe Übung). Fortsetzung zu Beispiel: Algorithmus 2.4.5: (Details zu Schritt (2)) (2.1) Berechne IP(j) (In-Potential) und OP(j) (Out-Potential); d.h. den Gesamtuss möglich in j hinein bzw. aus j heraus. Setze IP(s) = OP(t) = ∞ und P(j) = min(IP(j), OP(j)). (2.2) Wähle einen Knoten j mit kleinstem Potential P(j). Schicke Fluss der Stärke P(j) rückwärts nach s und vorwärts nach t (dabei arbeite Kanten nacheinander ab und versuche Kanten zu sättigen; berechne dabei gleichzeitig neue Potentiale und Kapazitäten). (2.3) Falls Knotenpotential 0 wird, lösche Knoten und adjazente Kanten. Falls Kante gesättigt wird, lösche Kante. (2.4) Falls noch ein Weg von s nach t in Df existiert, so gehe nach (2.2). (2.5) Berechne Gesamtuss als Summe aller konstruierten Flüsse. Beispiel 2.4.6: Fortsetzung zu Beispiel: Satz 2.4.7: Der Algorithmus von Dinic hat eine Laufzeit von O(|V |2 |E |). Beweis: Bemerkung 2.4.8: Durch eine genauere Analyse erhält man sogar O(|V |3 ) als Abschätzung für die Laufzeit vom Dinic Algorithmus. Schnellere Algorithmen für Maximum Fluss Problem: I O(nm log2 n) Galil, Naamad 1980 I O(n3 / log n) Cheriyan, Hagerup, Mehlhorn 1990. I O(nm + n2+ ) King, Rao, Tarjan 1992. I O ∗ (min(n2/3 , m1/2 )m) (gzz. Kapazitäten) Goldberg, Rao 1998. I O(nm) (gzz. Kapazitäten) Orlin 2012.