Sunteți pe pagina 1din 8

Algoritmi pe grafuri. Flux maxim n reea.

1 Preliminarii
Problema fluxului maxim, la fel ca multe alte probleme formulate pe grafe, i are
rdcinile n economia modern, mai exact n optimizarea economic. Mai recente sunt
aplicaiile n domeniul reelelor i fluxurilor informaionale. Dac este cercetat o reea de
transportare a unui material din un punct n care acesta este produs (surs) ntr-un punct de
depozitare sau prelucrare (stoc) prin canale de transport cu anumite capaciti, inevitabil apare
problema determinrii capacitii de transportare a materialului de la surs ctre stoc pentru
toat reeaua. Materialul i canalele de transport
pot avea cea mai divers natur: produse
petroliere i conducte; piese i transportoare;
pachete de date i canale informaionale, etc.
Pe grafe problema se formuleaz astfel:
Este dat un graf orientat
( , ) G V E
, cu ponderi
anexate arcurilor
1
: pentru arcul
( , ) i j
ponderea
este
, i j
q
. Pentru dou noduri date
, s t V
se
cere s se afle fluxul maxim care poate trece din
s
(surs) n
t
(stoc).(Desenul 1)
2.Algoritm.
2.1 Descriere general
Algoritmul Ford-Fulkerson se bazeaz pe determinarea iterativ a unor drumuri de cretere a
fluxului i acumularea acestora ntr-un flux total, pn la apariia n reea a unei tieturi
2
, care
separ sursa de stoc.
Se cerceteaz graful
( , ) G V E
cu capacitile arcurilor
, i j
q
, sursa
s
i stocul
t
(
, s t V
). Pe arcuri se definesc marcajele
, i j
e
, care vor indica valoarea curent a fluxului de-a
lungul arcului
( , ) i j
. Pentru marcajele arcurilor se va respecta urmtoarea condiie:

'


t s x
t x v
s x v
e e
i
i
i
x x
ij
x x
ij
i i
, 0
) ( ) (
1
Cu alte cuvinte: s produce un flux de mrime v. Pentru orice punct intermediar fluxul de
intrare este egal cu fluxul de ie ire. n t intr un flux de mrime v.
Problema fluxului maxim se reduce la determinarea unui v:
max
) ( ) (
1


i i
x x
ij
x x
ij
e e v
Legtura algoritmului Ford-Fulkerson cu tietura minim n graf este dat de
urmtoarea teorem:
1
Muchiile n grafe orientate mai sunt numite i arcuri.
2
Tietur n graf un set de muchii (arcuri), lichidarea crora divide graful n dou componente conexe.
Desenul 1.
Reea de transport cu sursa n nodul 1
i stocul n nodul 10.
Teorem: ntr-un graf orientat
( , ) G V E
valoarea v a fluxului maxim din s n t este egal cu
mrimea tieturii minime

( )
m m
X X , care separ s de t.
Tietura

0 0
( ) X X separ s de t dac
0 0
, s X t X
. Mrimea tieturii este suma ponderilor
arcurilor din
( , ) G V E
, cu nceputul n
0
X
i sfr itul n

0
X , sau

( )
( )

( ) 0 0
0 0
,
i j
ij
x x X X
v X X q



.
Tietura minim

( )
m m
X X este tietura pentru care

( )

( )
( )

( )
0 0
0 0
,
min
i j
m m ij
X X
x x X X
v X X q


_



,

Notaii:
Pentru implementarea algoritmului vor fi folosite att marcaje pentru arcuri ct i
marcaje pentru nodurile grafului. Marcajul unui nod x este format din trei componente:
precedent, flux, stare, care au semnificaia:
precedent nodul care l precede pe x n drumul de cretere curent
flux mrimea fluxului, care ajunge n nodul x pe drumul de cretere curent
stare starea curent a nodului x (nodul poate fi n una din trei stri: necercetat [marcaj
nul, valoarea - 0], atins[vecin al unui nod cercetat, valoarea - 1], cercetat[toi vecinii atini,
valoarea - 2]).
Vecinii nodului x
( ) : : , ( , ) x V V z V x z E
+ + +
(mulimea nodurilor n care se poate ajunge
direct din nodul x).
( ) : : , ( , ) x V V z V z x E

(mulimea nodurilor din care se poate ajunge
direct n nodul x).
2.2 Pseudocod
Pas 0
Marcajele arcurilor se iniializeaz cu 0.
Pas 1
Marcajele nodurilor se iniializeaz: precedent 0, stare 0, flux .
Marcajele muchiilor se pstreaz.
Pas 2
Iniializarea sursei s.
Marcajul sursei s : (+s, +, 1)
3
Se consider
i
x s
.
Pas 3
Cercetarea nodului atins x
i
.
a. Pentru toate punctele necercetate
, ,
( ) :
j i i j i j
x x e q
+
<
se aplic marcajul
(+x
i
, ,1), unde , ,
min( , )
i
x i j i j
q e
;
3
Precedent se consider tot nodul surs s, valoarea fluxului n s se consider infinit, s se consider atins.
b. Pentru toate punctele necercetate
,
( ) : 0
j i j i
x x e

>
se aplic marcajul
(-x
i
, ,1), unde ,
min( , )
i
x j i
e
.
c. Nodul x
i
este marcat cercetat. (Componenta stare primete valoarea 2 )
Pas 4
a. Dac nodul t este atins, se trece la pasul 5;(drumul curent de cretere a fost
construit),
altfel:
b. dac exist noduri atinse, dar t nc nu este atins, este selectat un nod atins x
i
i se
revine la pasul 3,
altfel:
c. fluxul maxim a fost obinut. SFRIT
4
.
Pas 5
Creterea fluxului. Modificarea marcajelor pe arcuri.
a. Se consider x t;
q
=
t
b. Dac nodul x are marcajul de forma (+z

, ,*) valoarea fluxului de-a lungul arcului
(z, x) este majorat cu
q
: e
zx
= e
zx
+
q
,
altfel, dac nodul x are marcajul de tip (-z

, ,*) valoarea fluxului de-a lungul arcului
(x, z) este micorat cu
q
: e
xz
= e
xz
-
q
;
c. x z . Dac
x s
, se revine la pasul 5.b, altfel la pasul 1.
2.3 Exemplu
Pentru graful reprezentat pe des. 1 sursa este nodul 1, stocul nodul 10.
ITERAIA 1
iniializare sursa 1: 1-(1, ,1 )
cercetare 1 : 2-(1,30,1); 3-(1,30,1); 1-(1,,2 )
cercetare 2 : 5-(2,30,1); 2-(1,30,2)
cercetare 3 : 4-(3,10,1); 9(3,10,1) 3-(1,30,2)
cercetare 4 : 7-(4,10,1); 4-(3,10,2)
cercetare 5 : 8-(5,25,1); 5-(2,30,2)
cercetare 7 : 10 -(7,10,1); 7-(4,10,2)

nod 1 2 3 4 5 6 7 8 9 10
precedent 1 1 1 3 2 0 4 5 3 7
flux 30 30 10 30 0 10 25 10 10
stare 2 2 2 2 2 0 2 1 1 1
n stoc se ajunge cu un flux de valoare 10. Marcajele
arcurilor, care formeaz drumul de cretere a fluxului (7,10)
(4,7) (3,4) (1,3) se modific.
ITERAIA 2
iniializare sursa 1: 1-(1, ,1 )
cercetare 1 : 2-(1,30,1); 3-(1,20,1); 1-(1,,2 )
cercetare 2 : 5-(2,30,1); 2-(1,30,2)
cercetare 3 : 9(3,10,1) 3-(1,20,2)
cercetare 5 : 4-(5,10,1); 8-(5,25,1); 5-(2,30,2)
cercetare 4 : 7-(4,8,1); 4-(5,10,2)
cercetare 7 : 10 -(7,8,1); 7-(4,8,2)

nod 1 2 3 4 5 6 7 8 9 10
precedent 1 1 1 5 2 0 4 5 3 7
flux 30 20 10 30 0 8 25 10 8
stare 2 2 2 2 2 0 2 1 1 1
n stoc se ajunge cu o cretere a fluxului de valoare 8.
Marcajele arcurilor, care formeaz drumul de cretere (7,10)
(4,7) (5,4) (2,5) (1,2) se modific.
4
Nu mai exist o cretere a fluxului, care ar ajunge la destinaia (stocul) t. Creterea precedent a fluxului a
determinat tietura minim, care separ s de t.
ITERAIA 3
iniializare sursa 1: 1-(1, ,1 )
cercetare 1 : 2-(1,22,1); 3-(1,20,1); 1-(1,,2 )
cercetare 2 : 5-(2,22,1); 2-(1,22,2)
cercetare 3 : 9(3,10,1) 3-(1,20,2)
cercetare 5 : 4-(5,2,1); 8-(5,22,1); 5-(2,22,2)
cercetare 4 : 4-(5,2,2)
cercetare 8 : 6-(8,5,1);10 -(8,22,1); 8-(5,22,2)

nod 1 2 3 4 5 6 7 8 9 10
precedent 1 1 1 5 2 8 0 5 3 8
flux 22 20 2 22 5 0 22 10 22
stare 2 2 2 2 2 1 0 2 1 1
Creterea fluxului: 22. Marcajele arcurilor, care formeaz
drumul de cretere (8,10) (5,8) (2,5) (1,2) se modific.
ITERAIA 4
iniializare sursa 1: 1-(1, ,1 )
cercetare 1 : 3-(1,20,1); 1-(1,,2 )
cercetare 3 : 9(3,10,1) 3-(1,20,2)
cercetare 9 : 4-(9,5,1); 7-(9,10,1); 9-(3,10,2)
cercetare 4 : 2-(4,5,1); 5-(-4,5,1) 4-(9,5,2)
cercetare 2 : 2-(4,5,2)
cercetare 5 : 8-(5,3,1) 5-(-4,5,2)
cercetare 7 : 10-(7,7,1) 7-(9,10,2)

nod 1 2 3 4 5 6 7 8 9 10
precedent 1 4 1 9 -4 0 9 5 3 7
flux 5 20 5 5 0 10 3 10 7
stare 2 2 2 2 2 0 2 1 2 1
Creterea fluxului: 7. Marcajele arcurilor, care formeaz
drumul de cretere (7,10) (9,7) (3,9) (1,3) se modific.
ITERAIA 5
iniializare sursa 1: 1-(1, ,1 )
cercetare 1 : 3-(1,13,1); 1-(1,,2 )
cercetare 3 : 9(3,3,1) 3-(1,13,2)
cercetare 9 : 4-(9,3,1); 7-(9,3,1); 9-(3,3,2)
cercetare 4 : 2-(4,3,1); 5-(-4,3,1) 4-(9,3,2)
cercetare 2 : 2-(4,3,2)
cercetare 5 : 8-(5,3,1) 5-(-4,3,2)
cercetare 7 : 7-(9,3,2)
cercetare 8 : 10-(8,3,1) 8-(5,3,2)

nod 1 2 3 4 5 6 7 8 9 10
precedent 1 4 1 9 -4 8 9 5 3 8
flux 3 13 3 3 3 3 3 3 3
stare 2 2 2 2 2 1 2 2 2 1
Creterea fluxului: 3. Marcajele arcurilor, care formeaz
drumul de cretere (8,10) (5,8) (5,4) (9,4) (3,9) (1,3) se
modific. Se observ micorarea fluxului pe arcul (5,4) cu
compensarea pe arcurile (3,9)(9,4).
Tot odat poate fi observat i tietura, format de
flux(5,8)(7,10). Prin urmare fluxul maxim ntre nodurile 1 i
10 are valoarea 50. Urmtoarea iteraie nu va mai realiza o
cretere a fluxului.
3. Probleme
3.1 Problem rezolvat (Sonde)
Enun:
ntr-o regiune petrolifer funcioneaz o sond, conectat la o uzin de prelucrare a petrolului
(rafinrie) prin n puncte de pompare i o reea de conducte. Capacitatea de extragere a sondei i
capacitatea de prelucrare a rafinriei sunt nelimitate. Pentru fiecare dintre conductele din reea
este cunoscut capacitatea ei i direcia de pompare a petrolului.
Cerin:
S se scrie un program, care va determina capacitatea maxim de extragere a petrolului prin
sond, astfel nct s fie asigurat transportarea lui integral prin sistemul de conducte ctre
rafinrie.
Intrare:
Fiierul text flux.in va conine pe prima linie trei numere ntregi: n numrul de puncte de
pompare, s indicele punctului de pompare ce corespunde sondei, t indicele punctului de
pompare ce corespunde rafinriei, separate prin spaiu.
Urmtoarele linii vor conine cte trei numere ntregi, separate prin spaiu descrierile
conductelor din reea n forma i,j,q unde i punctul din care e pompat petrolul prin
conduct, j punctul n care se pompeaz petrolul prin conduct, q capacitatea conductei.
Ieire:
Fiierul text flux.out va conine un numr ntreg capacitatea maxim de extragere a sondei
pentru asigurarea transportrii integrale a petrolului ctre rafinrie.

Restricii:
2 n 50;
0 < q 10000
Exemplu:
Flux in Flux.out
10 1 10
1 2 30
1 3 30
2 3 10
2 5 35
3 4 30
3 9 30
4 2 5
4 7 18
5 4 10
5 8 25
6 7 8
6 10 20
7 10 25
8 6 5
8 10 30
9 4 5
9 7 10
50
Program
Program flux;
type t2=array[1..50, 1..50] of longint;
nod=record
pr,del,st:integer;
end;
t3=array[1..50] of nod;
var e,a:t2;
b:t3;
delta,s,t,k,n,i,j:integer;
f,g: text;
procedure readdata;
var i,j,q:integer;
begin
assign(f,'ford.in'); reset(f);
readln(f,n,s,t);
while not eof(f) do
begin readln(f, i,j,q); a[i,j]:=q; end;
close(f);
end;
function sum(t: integer): longint;
var i,s : longint;
begin
s:=0;
for i:=1 to n do s:=s+e[i,t];
sum:=s;
end;
procedure init_b;
begin
fillchar(b, sizeof(b),0);
b[s].st:=1; b[s].pr:=+s;b[s].del:=maxint;
end;
function activ : integer;
var i : integer;
begin
activ:=0;
for i:=n downto 1 do if b[i].st=1 then activ:=i;
end;
procedure ford;
var x,i,d1,q: integer;
begin {ford}
{miscarea inainte, construim lantul}
repeat
x:=activ;
{dupa G+}
for i:=1 to n do
if (b[i].st=0) and (a[x,i]>0) and (e[x,i]<a[x,i]) then
begin
d1:=a[x,i]-e[x,i];
if d1<b[x].del then b[i].del:=d1 else b[i].del:=b[x].del;
b[i].st:=1; b[i].pr:=+x;
end;
{dupa G-}
for i:=1 to n do
if (b[i].st=0) and (e[i,x]>0) then
begin
d1:=e[i,x];
if d1<b[x].del then b[i].del:=d1 else b[i].del:=b[x].del;
b[i].st:=1; b[i].pr:=-x;
end;
b[x].st:=2;
until (b[t].st=1) or (activ=0);
{miscarea inapoi, extinderea fluxului}
delta:=0;
if b[t].st=1 then begin
x:=t;
delta:=b[t].del;
repeat
q:=abs(b[x].pr);
if b[x].pr>0 then e[q,x]:=e[q,x]+delta;
if b[x].pr<0 then e[x,q]:=e[x,q]-delta;
x:=q;
until x=s;
end;
end; {ford}
begin
fillchar(a,sizeof(a),0);
fillchar(e,sizeof(e),0);
readdata;
repeat
init_b;
ford;
until delta=0;
assign (g, 'ford.out'); rewrite(g);
writeln(g, sum(t)); close(g);
end.
3.2 Problem pentru rezolvare (Depozit)
Enun:
Cu trecerea timpului, n depozitul unei uzine s-au acumulat N piese, iar n curte - M lzi. Pentru
eliberarea spaiului n depozit piesele pot fi puse pentru pstrare n lzi. n fiecare lad poate fi
pus cel mult o pies. Mai mult dect att: din cauza dimensiunilor i a formei nu orice pies
poate fi pus n orice lad. Totui, pentru fiecare pies sunt cunoscute lzile n care ea poate fi
plasat.
Cerin:
S se scrie un program, care va determina numrul maxim de piese, care pot fi scoase din
depozit pentru a fi pstrate n lzi i o repartizare a acestora n lzi.
Intrare:
Fiierul text depozit.in va conine pe prima linie dou numere ntregi n numrul de piese
n depozit, m numrul de lzi, separate prin spaiu.
Urmtoarele n linii vor conine numere ntregi, separate prin spaiu. Linia i+1 va conine
indicii lzilor, n care poate plasat piesa cu numrul i.
Ieire:
Fiierul text depozit.out va conine pe prima linie un numr ntreg k numrul de piese,
care pot fi plasate n lzi. Urmtoarele k linii vor conine cte o pereche de numere ntregi:
indicele piesei i indicele lzii n care urmeaz s fie plasat piesa.

Restricii:
2 n,k 1000;
Exemplu:
depozit.in depozit.out
5 6
1
3
4
3 5
1 3 6
4
1 1
2 3
3 4
5 6

S-ar putea să vă placă și