Algorithmus von Edmonds-Karp

In der Informatik und Graph-Theorie ist der Algorithmus von Edmonds-Karp eine Durchführung der Methode von Ford-Fulkerson, für den maximalen Fluss in einem Fluss-Netz in O (V E) Zeit zu schätzen. Es ist asymptotisch langsamer als der Algorithmus des Wiederetiketts zur Vorderseite, der in O (V) Zeit läuft, aber es ist häufig in der Praxis für spärliche Graphen schneller. Der Algorithmus wurde zuerst von einem sowjetischen Wissenschaftler, Yefim (Chaim) Dinic, 1970, und unabhängig von Jack Edmonds und Richard Karp 1972 veröffentlicht. Der Algorithmus von Dinic schließt zusätzliche Techniken ein, die die Laufzeit auf O (VE) reduzieren.

Algorithmus

Der Algorithmus ist zum Algorithmus von Ford-Fulkerson, identisch

außer dass die Suchordnung, wenn sie den sich vermehrenden Pfad findet, ist

definiert. Der gefundene Pfad muss ein kürzester Pfad sein, der hat

verfügbare Kapazität. Das kann durch eine Breitensuche gefunden werden, weil wir Ränder Einheitslänge haben lassen. Die Laufzeit von

O (V E) wird durch die Vertretung dass jeder sich vermehrende Pfad gefunden

kann in O (E) Zeit, dass jedes Mal mindestens ein der gefunden werden

E Ränder wird durchtränkt, dass die Entfernung vom

der durchtränkte Rand zur Quelle entlang dem sich vermehrenden Pfad muss sein

länger als letztes Mal wurde es gesättigt, und dass die Länge ist

höchstens V. Ein anderes Eigentum dieses Algorithmus ist

dass die Länge des kürzesten sich vermehrenden Pfads vergrößert

monotonically. Es gibt einen zugänglichen Beweis darin.

Pseudocode

:For eine hohere Beschreibung, sieh Algorithmus von Ford-Fulkerson.

Algorithmus EdmondsKarp

Eingang:

C [1.. n, 1.. n] (Höchstmatrix)

E [1.. n, 1..?] (Nachbarlisten)

s (Quelle)

t (Becken)

Produktion:

f (Wert des maximalen Flusses)

F (Eine Matrix, die einen gesetzlichen Fluss mit dem maximalen Wert gibt)

f: = 0 (Ist anfänglicher Fluss Null)

F: = Reihe (1.. n, 1.. n) (Ist die restliche Kapazität von u bis v C [u, v] - F [u, v])

für immer

M, P: = BreadthFirstSearch (C, E, s, t, F)

wenn M = 0

Brechung

f: = f + M

(Rückzug-Suche, und schreibt Fluss)

v: = t

während v  s

u: = P [v]

F [u, v]: = F [u, v] + M

F [v, u]: = F [v, u] - M

v: = u

kehren Sie (f, F) zurück

Algorithmus BreadthFirstSearch

Eingang:

C, E, s, t, F

Produktion:

M [t] (Kapazität des Pfads gefunden)

P (Elternteiltisch)

P: = Reihe (1.. n)

für u in 1.. n

P [u]: =-1

P [s]: =-2 (überzeugen sich, wird Quelle nicht wieder entdeckt)

M: = Reihe (1.. n) (Kapazität des gefundenen Pfads zum Knoten)

M [s]: = 

Q: = Warteschlange

Q.push (s)

während Q.size > 0

u: = Q.pop

für v in E [u]

(Wenn es verfügbare Kapazität gibt, und v vorher in der Suche nicht gesehen wird)

wenn C [u, v] - F [u, v]> 0 und P [v] =-1

P [v]: = u

M [v]: = Minute (M [u], C [u, v] - F [u, v])

wenn v  t

Q.push (v)

sonst

geben Sie M [t], P zurück

kehren Sie 0, P zurück

Beispiel

In Anbetracht eines Netzes von sieben Knoten, Quelle A, Becken-G und Kapazitäten, wie gezeigt, unten:

In den über die Ränder geschriebenen Paaren, ist der aktuelle Fluss, und ist die Kapazität. Die restliche Kapazität von dazu, ist die Gesamtkapazität minus der Fluss, der bereits verwendet wird. Wenn der Nettofluss von dazu negativ ist, trägt er zur restlichen Kapazität bei.

Bemerken Sie, wie die Länge des sich vermehrenden Pfads, der durch den Algorithmus (im Rot) nie gefunden ist, abnimmt. Die gefundenen Pfade sind kürzestmöglich. Der gefundene Fluss ist der Kapazität über die minimale Kürzung im Graphen gleich, der die Quelle und das Becken trennt. Es gibt nur eine minimale Kürzung in diesem Graphen, die Knoten in die Sätze und, mit der Kapazität verteilend

:

Referenzen

  1. Algorithmen und Kompliziertheit (sieh Seiten 63-69).
http://www.cis.upenn.edu/~wilf/AlgComp3.html

Eid gegen den Modernismus / Knochen-Heilung
Impressum & Datenschutz