Edmonds-Karp algorithm (tsz. Edmonds-Karp algorithms)
Az Edmonds–Karp algoritmus a Ford–Fulkerson-módszer egy konkrét megvalósítása maximális áramlás (max-flow) problémára irányított, kapacitással ellátott hálózatokban. A kulcslépés: minden augmentáló utat nem mélységi, hanem szélességi kereséssel (BFS) találunk, így garantáltan az élek szerinti legrövidebb augmentáló utakat használjuk.
2. Algoritmus vázlata
Inicializálás
Minden él kezdetben nullás áramlást kap: .
A maradékgráf kapacitásai:
Augmentáló út keresése
Bővítés (augmentation)
Ha találtunk egy útvonalat , annak bottleneck kapacitása: .
Minden $ (u,v)P$ élre növeljük az áramlást:
Ismétlés
3. Pseudokód
EdmondsKarp(G, c, s, t): // G = (V,E), c(u,v) kapacitás, s forrás, t nyelő f(u,v) = 0 minden (u,v) ∈ E max_flow = 0 while van út P: s → t a maradékgráfban (BFS-en keresztül): // Bottleneck Δ = min{ c(u,v) - f(u,v) | (u,v) ∈ P } // Áramlás frissítése for minden (u,v) ∈ P: f(u,v) += Δ f(v,u) -= Δ max_flow += Δ return max_flow, f
4. Időkomplexitás
Minden iterációban egy BFS fut, ami .
Legrosszabb esetben az augmentációk száma (mivel minden bővítés legalább egy él maradékkapacitását csökkenti, és összesen legfeljebb különböző bottleneck-értékű változás lehet, mindegyiken át legfeljebb bővítés).
Így az Edmonds–Karp időkomplexitása:
5. Példa lépésről lépésre Legyen a hálózat:
s → u → v → t | ↘ ↑ ↓ w → x
Kapacitások (rövid jelöléssel):
6. Python-implementáció
from collections import deque, defaultdict
def edmonds_karp(capacity, s, t):
flow = defaultdict(lambda: defaultdict(int))
max_flow = 0
def bfs():
parent = {s: None}
q = deque()
while q:
u = q.popleft()
for v in capacity:
if v not in parent and capacity - flow > 0:
parent = u
if v == t:
return parent
q.append(v)
return None
while True:
parent = bfs()
if not parent:
break
# Bottleneck-érték számítása
v = t
delta = float('inf')
while v != s:
u = parent
delta = min(delta, capacity - flow)
v = u
# Áramlás augmentálása
v = t
while v != s:
u = parent
flow += delta
flow -= delta
v = u
max_flow += delta
return max_flow, flow
# Példa hálózat definíciója
capacity = defaultdict(dict)
capacity = {'u':10, 'w':5}
capacity = {'v':4, 'w':2}
capacity = {'x':3}
capacity = {'v':6}
capacity = {'t':8}
max_flow, flow = edmonds_karp(capacity, 's', 't')
print("Maximális áramlás:", max_flow)
7. Alkalmazások
8. Összefoglalás Az Edmonds–Karp algoritmus egyszerűen implementálható változata a Ford–Fulkerson-nak, BFS-sel biztosítva az augmentáló utak élszám szerinti minimalitását. Noha elméleti időkomplexitása , gyakorlati problémákban gyakran megfelelő, és alapul szolgál fejlettebb max-flow eljárásoknak.