Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
Algoritmul Ford-Fulkerson
(şi nu numai)
Reţea de transport
(6,3) 6
4
(6,5)
(2,1)
(9,8)
(4,4) (3,2)
(7,6) (7,5)
S 3 V
5
(7,2)
(4,3)
(3,1)
(6,3)
1 2
(6,5)
(2,1)
(9,8)
(4,4) (3,2)
(7,6) (7,5)
S 3 V
5
(7,2)
(4,3)
(3,1)
c(1, 2)=6
(6,3)
f(1, 2)=3
1 2
1 2
Arcul 4→6 este arc direct
Arcul 5→6 este arc invers
(2,1) (6,5)
(9,8)
Fie un drum în graful suport : (3,2)
(4,4)
s, 4, 6, 5, v
(7,5)
r(s, 4)=1 , r(4,6)=3 S 3
(7,6)
V
5
r(6, 5)=2 , r(5, v)=2 (7,2)
(4,3)
Capacitatea reziduală e 1 (3,1)
(6,3)
1 2
Teorema 1: Un flux f este de valoare maximă într-o reţea G, dacă şi numai dacă,
nu există drumuri de creştere a fluxului f în reţeaua G.
Teorema 2: Dacă toate capacităţile sunt întregi, atunci există un flux de valoare
maximă cu toate componentele întregi.
Istoric
Autor An Complexitate
• Ford Fulkerson 1956
• Edmonds, Karp 1969 O(E2V)
• Dinic 1970 O(EV2)
• Karzanov 1973 O(V3)
• Cherkassky 1976 O(√EV2)
• Malhotra (MPM) 1978 O(V3)
• Galil 1978 O(V5/3E2/3)
• Galil & Naamad 1979 O(EV log2V)
• Sleator &Tarjan 1980 O(EV logV)
• Goldberg & Tarjan 1985 O(EV log(V2/E))
(6,0)
(6, ?)
(2,0)
(2, ?)
(9,0)
(9, ?)
(4,0)
(4, ?) (3, ?)
(3,0)
(7,0) (7,0)
(7, ?)
S 3 (7, ?) V
5
(7,0)
(7, ?)
(4,0)
(4, ?)
(3,0)
(3, ?)
(6,0)
(6, ?)
1 2
Acest pas se va repeta atâta timp cât exista un drum de creştere; în final,
conform teoremei 1, fluxul găsit va fi maxim.
Finalitatea algoritmului este asigurată de faptul că la fiecare iteraţie valoarea
fluxului creşte cu o cantitate mai mare decât zero; cum valoarea fluxului maxim
este finită rezultă că este necesar un număr finit de iteraţii ale pasului 2.
Algoritmul Ford-Fulkerson
Sens de
parcurgere
Deoarece arcele pot fi de două tipuri, vom întâlni patru cazuri. Să le analizăm pe rând:
a) ambele arce sunt arce directe, deci fluxul va creşte pe ambele cu aceeaşi cantitate
r(P); analog d, în acest caz se va scădea aceeaşi cantitate
b) primul arc este invers, iar cel de-al doilea este direct, deci pe primul arc fluxul va
scădea, iar pe al doilea va creşte; deoarece ambele arce “ies” din nod, iar fluxul de
pe unul creşte, iar de pe celălalt scade cu aceeaşi cantitate, rezultă că suma a tot ce
“iese” din nod va rămâne constantă şi deci fluxul se va conserva; analog c;
Complexitatea algoritmului Ford-Fulkerson
• fiecare iteraţie a pasului doi necesită O(K) operaţii (K=|E|, numărul de
muchii din reţea);
• numărul de iteraţii nu poate fi precizat cu exactitate, dar trebuie considerat
că, pentru cazul cel mai defavorabil când la fiecare iteraţie fluxul creşte cu o
unitate, acesta este limitat de valoarea fluxului maxim X
2
(2,1) (6,5)
(9,8) (1,0) (1,0)
(1,0) (3,2)
(4,4)
S (7,6) (7,5)
(2,0)
3 V
2
0 2 5 3
(7,2)
(5,0) (4,3)
(1,0)
(3,1)
(6,3)
(3,0)
1 2
1 2
Algoritmul Dinic- căutarea drumurilor de creştere
În descrierea de mai jos d1(e)=c1(e)-f1(e), St- stiva
1. Iniţial toate muchiile sunt notate ca fiind nebocate, iar stiva St e goală
2. x=s
3. Parcurgem muchiile neblocate cu originea în x
4. Dacă nu există muchii neblocate atunci
4.1 Dacă St e goală atunci avem flux maxim =>stop
4.2 Extragem muchia e=(k,p) din St şi marcăm e ca blocată
4.3 Continuăm cu pasul 3 pentru x=k
5. Else
5.1 Pune muchia neblocată e=(x, y) în St şi x=y
5.2 Dacă x e diferit de v atunci continuăm cu pasul 3
6. Pentru x=v avem un drum de creştere în St şi fluxul trebuie crescut :
6.1 p=min(d1(e1), …, d1(ek)) unde e1,…, ek sunt muchiile drumului
6.2 Pentru fiecare muchie e din drum f1(e)=f1(e)+p şi dacă f1(e)=c1(e) atunci
marcăm pe e ca fiind blocat
Algoritmul Dinic - update reţea “principală”
Odată determinat fluxul maxim în reţeaua stratificată va trebui să modificăm fluxul
pe fiecare muchie a reţelei “principale” după cum urmează:
Pentru fiecare muchie e a reţelei stratificate
Dacă e->reverse este true atunci
f(e->copy)=f(e->copy) – f1(e)
altfel f(e->copy)=f(e->copy) + f1(e)
1 (3,0) 6
4
(1,0) (1,0)
(1,0)
S 3 (2,0) V
2
0 2 5 3
(5,0) (1,0)
(3,0)
1 2
1 2