Sunteți pe pagina 1din 120

PROIECTAREA ALGORITMILOR

AU

Conf. univ. dr. COSTEL BALC


2014

Tematica
1 Elemente de complexitatea algoritmilor si teoria
1.1 Notatii asimptotice . . . . . . . . . . . . . . . . .
1.2 Definitii generale privind grafurile . . . . . . . . .
1.3 Reprezentarea grafurilor . . . . . . . . . . . . . .
1.4 Grade . . . . . . . . . . . . . . . . . . . . . . . .
1.5 Conexitate . . . . . . . . . . . . . . . . . . . . . .
1.6 Parcurgerea grafurilor . . . . . . . . . . . . . . .

grafurilor
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .

2 Metoda Greedy
2.1 Descrierea metodei. Algoritmi generali . . . . . . .
2.2 O problema de maxim/minim . . . . . . . . . . . .
2.3 Memorarea optimala a textelor pe benzi . . . . . .
2.4 Arbori partiali de cost minim . . . . . . . . . . . .
2.5 Distante si drumuri minime. Algoritmul lui Dijkstra
2.6 Fluxuri maxime n retele . . . . . . . . . . . . . . .
3 Metoda Divide et Impera
3.1 Descrierea metodei. Algoritm general
3.2 Problema turnurilor din Hanoi . . . .
3.3 Cautarea binara . . . . . . . . . . . .
3.4 Sortarea prin interclasare (mergesort)
3.5 Sortarea rapida (quicksort) . . . . . .
3.6 O problema de acoperire . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

6
6
11
15
17
19
23

.
.
.
.
.
.

32
32
35
37
39
45
52

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

75
75
77
79
84
88
92

4 Metoda program
arii dinamice
4.1 Descrierea metodei. Algoritm general . . . . . . . .
4.2 Subsir crescator de lungime maxima . . . . . . . . .
4.3 Matricea drumurilor. Algoritmul Roy-Warshall . . .
4.4 Distante si drumuri minime. Algoritmul Roy-Floyd

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

95
95
96
98
103

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

TEMATICA
5 Metoda Backtracking
5.1 Descrierea metodei. Algoritmi generali . . . . . . . . . . . .
5.2 Problema celor n dame . . . . . . . . . . . . . . . . . . . . .
5.3 Colorarea grafurilor . . . . . . . . . . . . . . . . . . . . . . .

2
107
. 107
. 115
. 117

Evaluare
Prezenta: 10%
Activitate laborator: 30% (Programe si probleme din Temele de laborator)
Teme de casa: 10% (Programe si probleme suplimentare)
Examen final: 50% (Proba scrisa: teorie, algoritmi -cu implementaresi probleme)

Bibliografie
[1] A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, AddisonWesley, Massachusetts, 2009.
[2] Gh. Barbu, V. P
aun, Programarea n limbajul C/C++, Editura Matrix Rom, Bucuresti, 2011.
[3] Gh. Barbu, V. P
aun, Calculatoare personale si programare n C/C++, Editura Didactic
a si Pedagogic
a, Bucuresti, 2005.
[4] Gh. Barbu, I. V
aduva, M. Bolosteanu, Bazele informaticii, Editura Tehnica, Bucuresti, 1997.
[5] C. Balc
au, Combinatoric
a si teoria grafurilor, Editura Universitatii din Pitesti,
Pitesti, 2007.
[6] O. Basc
a, L. Livovschi, Algoritmi euristici, Editura Universitatii din Bucuresti, Bucuresti, 2003.
[7] E. Cerchez, M. Serban, Programarea n limbajul C/C++ pentru liceu. Vol. 2: Metode
si tehnici de programare, Ed. Polirom, Iasi, 2005.
[8] E. Ciurea, L. Ciupal
a, Algoritmi. Introducere n algoritmica fluxurilor n retele, Editura Matrix Rom, Bucuresti, 2006.
[9] T.H. Cormen, Algorithms Unlocked, MIT Press, Cambridge, 2013.
[10] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduction to Algorithms, MIT
Press, Cambridge, 2009.
[11] C. Croitoru, Tehnici de baz
a n optimizarea combinatorie, Editura Universitatii Al.
I. Cuza, Iasi, 1992.
[12] N. Dale, C. Weems, Programming and problem solving with JAVA, Jones & Bartlett
Publishers, Sudbury, 2008.
[13] D. Du, X. Hu, Steiner Tree Problems in Computer Communication Networks, World
Scientific Publishing Co. Pte. Ltd., Hackensack, 2008.
[14] S. Even, Graph Algorithms, Cambridge University Press, Cambridge, 2012.

5
[15] H. Georgescu, Tehnici de programare, Editura Universitatii din Bucuresti, Bucuresti,
2005.
[16] C.A. Giumale, Introducere n analiza algoritmilor. Teorie si aplicatii, Ed. Polirom,
Iasi, 2004.
[17] F.V. Jensen, T.D. Nielsen, Bayesian Networks and Decision Graphs, Springer, New
York, 2007.
[18] D. Jungnickel, Graphs, Networks and Algorithms, Springer, Heidelberg, 2013.
[19] D.E. Knuth, The Art Of Computer Programming. Vol. 4A: Combinatorial Algorithms, Addison-Wesley, Massachusetts, 2011.
[20] B. Korte, J. Vygen, Combinatorial Optimization. Theory and Algorithms, Springer,
Heidelberg, 2012.
[21] L. Livovschi, H. Georgescu, Sinteza si analiza algoritmilor, Editura Stiintific
a si
Enciclopedica, Bucuresti, 1986.
[22] D. Logofatu, Algoritmi fundamentali n C++: Aplictii, Ed. Polirom, Iasi, 2007.
[23] D. Lucanu, M. Craus, Proiectarea algoritmilor, Ed. Polirom, Iasi, 2008.
[24] D.R. Popescu, Combinatoric
a si teoria grafurilor, Societatea de Stiinte Matematice
din Rom
ania, Bucuresti, 2005.
[25] N. Popescu, Data structures and algorithms using Java, Editura Politehnica Press,
Bucuresti, 2008.
[26] V. Preda, C. Balc
au, Entropy optimization with applications, Editura Academiei
Rom
ane, Bucuresti, 2010.
[27] R. Stephens, Essential Algorithms: A Practical Approach to Computer Algorithms,
Wiley, Indianopolis, 2013.
[28] S. T
anasa, C. Olaru, S. Andrei, Java de la 0 la expert, Ed. Polirom, Iasi, 2007.
[29] T. Toadere, Grafe. Teorie, algoritmi si aplicatii, Editura Albastr
a, Cluj-Napoca,
2002.
[30] I. Tomescu, Combinatoric
a si teoria grafurilor, Tipografia Universitatii din Bucuresti, Bucuresti, 1978.
[31] I. Tomescu, Probleme de combinatoric
a si teoria grafurilor, Editura Didactica si
Pedagogic
a, Bucuresti, 1981.
[32] I. Tomescu, Data structures, Editura Universitatii din Bucuresti, Bucuresti, 2004.
[33] ***, Handbook of combinatorics, edited by R.L. Graham, M. Grotschel and L. Lovasz,
Elsevier, Amsterdam, 1995.
[34] ***, Handbook of discrete and combinatorial mathematics, edited by K.H. Rosen,
J.G. Michaels, J.L. Gross, J.W. Grossman and D.R. Shier, CRC Press, Boca Raton,
2000.

Tema 1
Elemente de complexitatea
algoritmilor si teoria grafurilor
1.1

Notatii asimptotice

Vom defini un tip de functii care reprezinta un bun model pentru descrierea
complexitatii temporale a unui algoritm, adica a dependentei timpului de
executie fata de dimensiunea datelor de intrare.
Definitia 1.1.1. O functie asimptotic pozitiv
a (prescurtat a.p.) este o
functie f : N \ A R a..
A N este o multime finita;
n0 N \ A astfel ncat f (n) > 0, n n0 .
Observatia 1.1.1. De cele mai multe ori, multimea A este de forma
A=

{0, 1, 2, . . . , k} , unde k N.
{z
}
|

primele numere naturale

(3n4 + n + 3) n 5
Exemplul 1.1.1. Functia f : D R, f (n) =
, unde
(5n + 1)(n 8)
D = {n N | n 5, n 6= 8}, este asimptotic pozitiva, deoarece D = N \ A
cu A = {0, 1, 2, 3, 4, 8} (multime finita) si f (n) > 0, n 9.
ln(n5 + 1) n
, nu este
(n 1)(n 6)
asimptotic pozitiva, deoarece (n 1)(n 6) > 0, n 7, dar lim [ln(n5 +
Exemplul 1.1.2. Functia g : N \ {1, 6} R, g(n) =

1) n] = , deci n0 N, n0 7 a.. g(n) < 0, n n0 .


6

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Lema 1.1.1. O functie polinomiala f : N R, de grad p,


f (n) = ap np + ap1 np1 + + a1 n + a0 , a0 , a1 , . . . , ap R, ap 6= 0,
este asimptotic pozitiva daca si numai daca ap > 0.
Definitia 1.1.2. Fie g o functie a.p. (asimptotic pozitiva). Definim multimea
de functii O (g) (sau O (g(n))) ca fiind

O (g) = f f = functie a.p., c > 0, n0 N a..

f (n) c g(n), n n0 .
Daca f O (g) spunem ca f este asimptotic m
arginit
a superior
de g.
Pentru f O (g) se mai utilizeaza (n mod abuziv!) si scrierea f (n) =
O (g(n)).
Se citeste:
f este de ordinul O mare de g sau

f (n) este de ordinul O mare de g(n) (cand n ).

Observatia 1.1.2. Ilustrarea grafica a notatiei f O (g), si anume ca pentru


n n0 graficul functiei c g se afla deasupra graficului functiei f , este data
n Figura 1.1.1.

Figura 1.1.1:

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Definitia 1.1.3. Fie g o functie a.p. (asimptotic pozitiva). Definim multimea


de functii (g) (sau (g(n))) ca fiind

(g) = f f = functie a.p., c > 0, n0 N a..

c g(n) f (n), n n0 .
Daca f (g) spunem ca f este asimptotic m
arginit
a inferior
de g.
Pentru f (g) se mai utilizeaza (n mod abuziv!) si scrierea f (n) =
(g(n)).
Se citeste:
f este de ordinul Omega mare de g sau
f (n) este de ordinul Omega mare de g(n) (cand n ).
Observatia 1.1.3. Ilustrarea grafica a notatiei f (g), si anume ca pentru
n n0 graficul functiei c g se afla sub graficul functiei f , este data n Figura
1.1.2.

Figura 1.1.2:

Definitia 1.1.4. Fie g o functie a.p. (asimptotic pozitiva). Definim multimea


de functii (g) (sau (g(n))) ca fiind

(g) = f f = functie a.p., c1 , c2 > 0, n0 N a..

c1 g(n) f (n) c2 g(n), n n0 .

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Daca f (g) spunem ca f este asimptotic m


arginit
a inferior

si superior de g (sau ca f este asimptotic echivalent


a cu g, sau
ca f si g au acela
si ordin de cre
stere).
Pentru f (g) se mai utilizeaza (n mod abuziv!) si scrierea f (n) =
(g(n)).
Se citeste:
f este de ordinul Theta (mare) de g sau
f (n) este de ordinul Theta (mare) de g(n) (cand n ).
Observatia 1.1.4. Ilustrarea grafica a notatiei f (g), si anume ca pentru
n n0 graficul functiei f este cuprins ntre graficele functiilor c1 g si c2 g,
este data n Figura 1.1.3.

Figura 1.1.3:

Observatia 1.1.5. Notatia O se foloseste pentru a exprima complexitatea unui


algoritm corespunzatoare timpului de executie n cazul cel mai defavorabil,
fiind astfel cea mai adecvata analizei algoritmilor.
Notatia se foloseste pentru a exprima complexitatea unui algoritm corespunzatoare timpului de executie n cazul cel mai favorabil.
Notatia se foloseste atunci cand se poate determina exact timpul de
executie al unui algoritm sau atunci cand timpii de executie corespunzatori
cazurilor extreme sunt exprimati prin functii care au acelasi ordin de crestere.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

10

Propozitia 1.1.1. Fie f si g doua functii asimptotic pozitive.


a) f (n) = O(g(n)) daca si numai daca g(n) = (f (n)).
b) f (n) = (g(n)) daca si numai daca f (n) = O (g(n)) si f (n) = (g(n)).
Propozitia 1.1.2. Fie f si g doua functii asimptotic pozitive astfel ncat
exista
f (n)
= .
lim
n g(n)
a) f (n) = O (g(n)) daca si numai daca [0, +).
b) f (n) = (g(n)) daca si numai daca (0, +].
c) f (n) = (g(n)) daca si numai daca (0, +).
Exemplul 1.1.3. Vom aplica propozitia anterioar
a pentru functia asimptotic
(3n4 + n + 3) n 5
, unde D = {n N | n
pozitiva f : D R, f (n) =
(5n + 1)(n 8)
5, n 6= 8}, considerata n Exemplul 1.1.1.
Deoarece

f (n)
(3n4 + n + 3) n 5
lim
= lim
n n3
n n3 (5n + 1)(n 8)
q

1 n5
n4 n 3 + n13 + n34
= 0,
= lim
n
n5 (5 + n1 )(1 n8 )
rezulta ca f (n) = O (n3 ), dar f (n) 6= (n3 ) si f (n) 6= (n3 ).
Deoarece

f (n)
(3n4 + n + 3) n 5
lim
= lim
n n2
n n2 (5n + 1)(n 8)
q

3
1
4
1 n5
n n 3 + n3 + n4
= lim
= ,
n
n4 (5 + n1 )(1 n8 )
rezulta ca f (n) = (n2 ), dar f (n) 6= O (n2 ) si f (n) 6= (n2 ).
Deoarece

f (n)
(3n4 + n + 3) n 5
lim
= lim 2
n n2 n
n n
n(5n + 1)(n 8)
q

n4 n 3 + n13 + n34
1 n5
3

,
= lim
=
8
1
n
5
n4 n(5 + n )(1 n )

rezulta ca f (n) = (n2 n), deci f (n) = O (n2 n) si f (n) = (n2 n).

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

11

Propozitia 1.1.3. Daca f : N R este o functie polinomiala de grad p,


f (n) = ap np + ap1 np1 + + a1 n + a0 , a0 , a1 , . . . , ap R, ap > 0,
atunci
a) f (n) = O (nk ), k p;
b) f (n) = (nk ), k p;
c) f (n) = (np ).
Definitia 1.1.5. Fie A un algoritm, n dimensiunea datelor de intrare si
T (n) timpul de executie estimat pentru algoritmul A. Se spune ca algoritmul
A are comportare polinomial
a (sau ca este polinomial sau ca apartine
clasei P ) daca p > 0 astfel ncat T (n) = O (np ).
Observatia 1.1.6. Algoritmii polinomiali sunt, n general, acceptabili n practica. Algoritmii care necesita un timp de calcul exponential sunt utilizati
numai n cazuri exceptionale si doar pentru date de intrare de dimensiuni
relativ mici.

1.2

Definitii generale privind grafurile

Grafurile sunt modele matematice cu o gama larga de aplicatii. Aceasta


aplicabilitate a condus la dezvoltarea accelerata a teoriei grafurilor, atat din
punct de vedere al rezultatelor teoretice cat si al algoritmicii, grafurile impunandu-se drept modele de baza n informatica, n special n teoria structurilor de date, a proiectarii si analizei algoritmilor.
Definitia 1.2.1. Un graf neorientat (graf, pseudograf, graf general)
este o pereche G = (V, E) unde:
V este o multime finita si nevida, elementele sale numindu-se nodurile
(v
arfurile, punctele) grafului G;
E este o colectie (multime multipla, multiset) finita de perechi neordonate, posibil egale, de noduri, elementele sale numindu-se muchiile
(leg
aturile directe, liniile) grafului G.
Observatia 1.2.1. Intr-o pereche neordonata, notata [x, y], nu conteaza ordinea dintre elemente, adica [x, y] = [y, x].
Definitia 1.2.2. Un graf orientat (digraf, pseudodigraf) este o pereche
G = (V, E) unde:

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

12

V este o multime finita si nevida, elementele sale numindu-se v


arfurile
(nodurile, punctele) grafului G;
E este o colectie (multime multipla, multiset) finita de perechi ordonate
de varfuri, elementele sale numindu-se arcele (leg
aturile directe ale)
grafului G.
Observatia 1.2.2. Intr-o pereche ordonata, notata (x, y), conteaza ordinea
dintre elemente, adica (x, y) 6= (y, x) pentru x 6= y.
Definitia 1.2.3. Numarul de noduri ale unui graf (neorientat sau orientat)
se numeste ordinul grafului, iar numarul de muchii sau arce se numeste
dimensiunea grafului.
Definitia 1.2.4. a) Daca e = [x, y] este o muchie a unui graf neorientat,
atunci nodurile x si y se numesc extremit
atile muchiei e si spunem
ca muchia e este incident
a cu nodurile x si y.
b) Daca e = (x, y) este un arc al unui graf orientat, atunci nodul x se
numeste extremitatea initial
a iar nodul y se numeste extremitatea
final
a a arcului e si spunem ca arcul e este incident cu x spre exterior si cu y spre interior.
c) O bucl
a a unui graf (neorientat sau orientat) este o muchie sau un arc
avand extremitatile egale (adica o muchie de forma [x, x], respectiv un
arc de forma (x, x)).
d) Doua noduri x si y ale unui graf (neorientat sau orientat) se numesc
adiacente (vecine) daca exista o muchie sau un arc incident cu x si
cu y (adica o muchie de forma [x, y], respectiv un arc de forma (x, y)
sau de forma (y, x)).
Definitia 1.2.5. Daca n colectia (multimea multipla) de muchii sau arce a
unui graf (neorientat sau orientat) exista doua sau mai multe elemente egale
(si aflate pe pozitii diferite), atunci acestea se numesc muchii sau arce
multiple.
Definitia 1.2.6. Un graf (neorientat sau orientat) fara bucle se numeste
multigraf (neorientat, respectiv orientat).
Definitia 1.2.7. Un graf (neorientat sau orientat) se numeste simplu (sau
strict) daca nu contine nici bucle si nici muchii sau arce multiple.

13

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Observatia 1.2.3. a) Un graf neorientat simplu este o pereche G = (V, E),


unde V este o multime finita si nevida (de elemente numite noduri) iar E
P2 (V ) este o multime finita (de elemente numite muchii), unde
P2 (V ) = {{x, y}|x, y V, x 6= y}
(multimea tuturor submultimilor cu doua elemente ale lui V ).
b) Un graf orientat simplu este o pereche G = (V, E), unde V este o
multime finita si nevida (de elemente numite noduri) iar E V V \
{(x, x)|x V } este o multime finita (de elemente numite arce).
Definitia 1.2.8. Fie G = (V, E) un graf (orientat sau neorientat). O
reprezentare grafic
a a lui G se obtine reprezentand nodurile sale prin
puncte distincte (n plan sau pe o alta suprafata data), iar muchiile [x, y] sau
arcele (x, y) prin segmente (de curba continua) distincte neorientate, respectiv orientate, de la punctul ce reprezinta nodul x pana la punctul ce reprezinta
nodul y.
Exemplul 1.2.1. Graful neorientat G = (V, E), cu V = {1, 2, 3, 4, 5, 6} si E =
{e1 , e2 , e3 , e4 , e5 , e6 , e7 , e8 , e9 }, unde e1 = [1, 2], e2 = [1, 4], e3 = [2, 2], e4 =
[2, 5], e5 = [3, 6], e6 = [3, 6], e7 = [4, 5], e8 = [4, 5], e9 = [4, 5] (E este o
multime multipla!) are reprezentarea grafica din Figura 1.2.1.

e3
1

e1

e2
4

e4
e7
e8
e9

e5

e6

Figura 1.2.1:

Figura 1.2.2:

Acest graf are ordinul 6 si dimensiunea 9. El contine bucla e3 , muchiile


multiple e5 , e6 si muchiile multiple e7 , e8 , e9 , deci nu este nici multigraf, nici
simplu. Nodurile 1 si 2 sunt adiacente, iar nodurile 1 si 5 nu sunt adiacente.
Exemplul 1.2.2. Graful orientat G = (V, E), cu V = {1, 2, 3, 4, 5} si
E = {(1, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (5, 4)}
este un graf simplu avand reprezentarea grafica din Figura 1.2.2. Arcul (3, 1)
are extremitatea initiala 3 si extremitatea finala 1.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

14

Definitia 1.2.9. Fie G1 = (V1 , E1 ) si G2 = (V2 , E2 ) doua grafuri (ambele


orientate sau ambele neorientate).
a) Spunem ca G1 este un subgraf al lui G2 si notam G1 G2 daca
V1 V2 si E1 E2 .
b) Spunem ca G1 este un graf partial al lui G2 daca V1 = V2 si E1 E2 .
Definitia 1.2.10. Fie G = (V, E) un graf (neorientat sau orientat) si U V
o submultime nevida de noduri. Subgraful indus (generat) de U n G este
subgraful G[U] = (U, F ), unde F este colectia tuturor muchiilor sau arcelor
din E ce au ambele extremitati n U.
Definitia 1.2.11. Fie G = (V, E) un graf (orientat sau neorientat) si F E
o colectie de muchii sau de arce.
a) Subgraful indus (generat) de F n G este subgraful G[F ] = (U, F ),
unde U este multimea tuturor nodurilor din V ce sunt extremitati pentru
cel putin o muchie sau un arc din F .
b) Graful partial indus (generat) de F n G este graful partial (V, F ).
Exemplul 1.2.3. Pentru graful neorientat din Exemplul 1.2.1, subgraful generat de submultimea de noduri {1, 3, 4, 5} are reprezentarea din Figura 1.2.3.
1

Figura 1.2.3:

Pentru graful orientat din Exemplul 1.2.2, subgraful generat de submultimea de arce {(2, 3), (5, 4)} are reprezentarea din Figura 1.2.4, iar graful
partial generat de aceeasi submultime de arce are reprezentarea din Figura
1.2.5.
Definitia 1.2.12. Fie G = (V, E) un graf (neorientat sau orientat) si U V
o submultime de noduri a.. U 6= V . Subgraful obtinut din G prin
eliminarea nodurilor multimii U este subgraful G \ U = (V \ U, F ),
unde F este colectia tuturor muchiilor sau arcelor din E ce nu sunt incidente
cu niciun nod din U.

15

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Figura 1.2.4:

Figura 1.2.5:

Observatia 1.2.4. Fie G = (V, E) un graf (neorientat sau orientat) si U V .


a) Daca U 6= , atunci G[U] = G \ (V \ U).
b) Daca U 6= V , atunci G \ U = G[V \ U].
Definitia 1.2.13. Fie G = (V, E) un graf (neorientat sau orientat) si F
E o colectie de muchii sau arce. Graful partial obtinut din G prin
eliminarea muchiilor sau arcelor din F este G \ F = (V, E \ F ) (adica
subgraful ce contine toate nodurile lui G si muchiile sau arcele lui G care nu
apartin lui F ).
Observatia 1.2.5. Fie G = (V, E) un graf (neorientat sau orientat) si F E.
a) Graful partial indus de F n G este G \ (E \ F ).
b) Graful partial G \ F este chiar graful partial indus de E \ F n G.

1.3

Reprezentarea grafurilor

In continuare descriem cateva forme de reprezentare (memorare) a grafurilor n informatica. Dintre aceste forme, cea mai utilizata este matricea de
adiacenta.
Definitia 1.3.1. Fie G = (V, E) un graf (neorientat sau orientat) unde
V = {v1 , . . . , vn } si E = {e1 , . . . , em }. Matricea de adiacenta
asociata
grafului G este matricea A = (aij )i,j=1,n definita prin
aij = numarul de muchii sau de arce ek E de la nodul vi la nodul vj (adica
muchii de forma ek = [vi , vj ], respectiv arce de forma ek = (vi , vj )),
i, j {1, . . . , n}.
Observatia 1.3.1. a) Daca graful neorientat G = (V, E) este simplu, atunci

1, daca vi si vj sunt adiacente (adica [vi , vj ] E),
aij =
0, n caz contrar.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

16

b) Daca graful orientat G = (V, E) este simplu, atunci



1, daca (vi , vj ) E,
aij =
0, n caz contrar.
Exemplul 1.3.1. Matricea de adiacenta asociata grafului neorientat din Exemplul 1.2.1 este

0 1 0 1 0 0
1 1 0 0 1 0

0 0 0 0 0 2

A=
1 0 0 0 3 0 ,

0 1 0 3 0 0
0 0 2 0 0 0
iar matricea de adiacenta asociata

0
0

A=
1
0
0

grafului orientat din Exemplul 1.2.2 este

1 0 0 0
0 1 1 1

1 0 0 0
.
0 0 0 0
0 0 1 0

Observatia 1.3.2. Evident, orice graf neorientat are matricea de adiacenta


simetrica (aij = aji i, j).
Propozitia 1.3.1. Fie V = {v1 , . . . , vn }, n N .
a) Numarul de grafuri neorientate simple avand multimea de noduri V
n(n1)
este egal cu 2 2 .
b) Numarul de grafuri orientate simple avand multimea de noduri V este
2
egal cu 2n n .

Observatia 1.3.3. Fie G = (V, E) un graf (neorientat sau orientat), unde


V = {v1 , . . . , vn } si E = {e1 , . . . , em }, E 6= . O alta reprezentare a grafului
G este matricea T ce retine n fiecare coloana extremitatile unei muchii sau
arc, adica T = (tkj ) k = 1, 2 definita prin t1j = x, t2j = y, unde ej = [x, y]
j = 1, m

(pentru muchii) sau ej = (x, y) (pentru arce), j {1, . . . , m}. Pentru


graful din Exemplul 1.2.1 matricea T este


1 1 2 2 3 3 4 4 4
,
T =
2 4 2 5 6 6 5 5 5

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

17

iar pentru graful din Exemplul 1.2.2 matricea T este




1 2 2 2 3 3 5
T =
.
2 3 4 5 1 2 4
Observatia 1.3.4. O alta forma frecvent utilizata n reprezentarea grafurilor
simple este data de listele de adiacent
a (memorate static sau dinamic).
Lista de adiacenta a unui nod x este formata din toate nodurile y pentru
care exista muchie sau arc de la x la y (y se numeste succesor direct al lui
x). Pentru graful orientat din Exemplul 1.2.2, listele de adiacenta sunt
L(1) = {2}, L(2) = {3, 4, 5}, L(3) = {1, 2}, L(4) = , L(5) = {4},
unde L(i) reprezinta lista de adiacenta a nodului i. Pentru grafurile orientate
simple, deseori se memoreaza si listele de predecesori directi. Lista de
predecesori directi a unui nod x este formata din toate nodurile y pentru
care exista arc de la y la x (y se numeste predecesor direct al lui x).
Pentru graful din Exemplul 1.2.2, aceste liste sunt

L(1)
= {3}, L(2)
= {1, 3}, L(3)
= {2}, L(4)
= {2, 5}, L(5)
= {2}.
Evident, pentru grafurile neorientate notiunile de succesor direct si predecesor
direct coincid, fiind si sinonime cu notiunile de vecin sau adiacent.
Observatia 1.3.5. Alegerea uneia sau alteia dintre formele de reprezentare a
grafurilor descrise mai sus depinde de eficienta si de usurinta implementarii
operatiilor necesare de prelucrare a acestor forme, deci de tipul problemei
modelate prin grafuri si de algoritmul de rezolvare utilizat.

1.4

Grade

Definitia 1.4.1. Fie G = (V, E) un graf si x V un nod arbitrar fixat.


a) Daca G este neorientat, atunci gradul lui x, notat dG (x) = d(x), este
definit prin
d(x) = a(x) + 2 b(x),
unde a(x) reprezinta numarul de muchii e E ce nu sunt bucle si sunt
incidente cu x, iar b(x) este numarul de bucle e E ce sunt incidente
cu x.
b) Daca G este orientat, atunci:

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

18

gradul de ie
sire (semigradul exterior) al lui x, notat d+
G (x) =
d+ (x), reprezinta numarul de arce e E incidente cu x spre exterior;
gradul de intrare (semigradul interior) al lui x, notat d
G (x) =
d (x), reprezinta numarul de arce e E incidente cu x spre interior;
gradul (total al) lui x, notat dG (x) = d(x), este
d(x) = d+ (x) + d (x).
Exemplul 1.4.1. Pentru graful neorientat din Exemplul 1.2.1, gradele nodurilor sunt: d(1) = 2, d(2) = 4, d(3) = 2, d(4) = 4, d(5) = 4, d(6) = 2.
Pentru graful orientat din Exemplul 1.2.2, gradele nodurilor sunt:
d+ (1) = 1,
d+ (2) = 3,
d+ (3) = 2,
d+ (4) = 0,
d+ (5) = 1,

d (1) = 1,
d (2) = 2,
d (3) = 1,
d (4) = 2,
d (5) = 1,

d(1) = 2,
d(2) = 5,
d(3) = 3,
d(4) = 2,
d(5) = 2.

Propozitia 1.4.1. Fie G = (V, E) un graf, V = {v1 , . . . , vn }, si fie A =


(aij )i,j=1,n matricea de adiacenta a grafului G.
a) Daca G este neorientat, atunci d(vi ) = aii +

n
P

j=1

b) Daca G este orientat, atunci d+ (vi ) =

n
P

aij , i {1, . . . , n}.

aij , d (vi ) =

j=1

{1, . . . , n}.

n
P

j=1

aji , i

Observatia 1.4.1. Daca graful G este simplu, atunci aii = 0 i si egalitatea


n
P
aij .
de la punctul a) al propozitiei anterioare devine d(vi ) =
j=1

Propozitia 1.4.2. Fie G = (V, E) un graf avand dimensiunea m. Atunci


P
d(x) = 2m.
xV
In plus, daca G este orientat atunci P d+ (x) = P d (x) = m.
xV

xV

Definitia 1.4.2. Fie G = (V, E) un graf. Un nod x V cu dG (x) = 0


se numeste nod izolat, iar un nod y V cu dG (y) = 1 se numeste nod
terminal.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

1.5

19

Conexitate

Definitia 1.5.1. Fie G = (V, E) un graf.


a) Un lant n graful G este o succesiune alternanta
[v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1],
unde v1 , v2 , . . . , vk+1 V (noduri), e1 , e2 , . . . , ek E (muchii sau arce),
k N, cu proprietatea ca pentru orice i {1, . . . , k} ei este o muchie
sau un arc avand extremitatile vi si vi+1 (adica ei = [vi , vi+1 ] pentru
un graf neorientat, respectiv ei = (vi , vi+1 ) sau ei = (vi+1 , vi ) pentru un
graf orientat). Nodurile v1 si vk+1 se numesc extremit
atile lantului,
iar nodurile v2 , . . . , vk se numesc noduri intermediare. Numarul
k de muchii sau arce (nu neaparat distincte) ale lantului se numeste
lungimea lantului.
b) Un lant se numeste nchis daca are extremitatile egale, respectiv deschis n caz contrar.
c) Un lant se numeste simplu daca muchiile sau arcele sale sunt diferite
doua cate doua (considerand diferite si muchiile sau arcele multiple
aflate pe pozitii diferite n E).
d) Un lant deschis se numeste elementar daca nodurile sale sunt diferite
doua cate doua. Un lant nchis se numeste elementar daca este simplu si, cu exceptia extremitatilor, nodurile sale sunt diferite doua cate
doua.
e) Un ciclu este un lant nchis si simplu de lungime nenula (adica cu cel
putin o muchie sau un arc).
f ) Un drum este un lant [v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1 ] cu proprietatea ca
pentru orice i {1, . . . , k} muchia sau arcul ei are extremitatea initiala
vi si extremitatea finala vi+1 (adica ei = (vi , vi+1 ) pentru graf orientat).
Un astfel de drum se noteaza si cu
(v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1),
nodurile v1 si vk+1 numindu-se extremitatea initial
a, respectiv extremitatea final
a a drumului.
g) Un circuit este un drum nchis si simplu de lungime nenula (adica un
drum ce este si ciclu).

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

20

Observatia 1.5.1. Pentru grafurile neorientate notiunile de lant si de drum


coincid; deci si notiunile de ciclu si de circuit coincid.
Observatia 1.5.2. Orice lant elementar este si simplu.
Observatia 1.5.3. Pentru grafurile neorientate sau orientate simple orice lant
[v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1 ] sau drum (v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1) este bine
determinat de nodurile sale (deoarece muchia sau arcul ei nu poate fi decat
singura muchie sau singurul arc de la vi la vi+1 , i), deci poate fi notat, pe
scurt, doar prin nodurile succesive
[v1 , v2 , . . . , vk , vk+1], respectiv (v1 , v2 , . . . , vk , vk+1 ).
Exemplul 1.5.1. Pentru graful neorientat din Exemplul 1.2.1,
[1, e2 , 4, e9 , 5, e4 , 2, e1, 1, e2 , 4]
este un lant (drum) deschis, nesimplu (contine de doua ori e2 ), neelementar
(contine de doua ori 1), de lungime 5.
In acelasi graf, [1, e1 , 2, e3 , 2, e4 , 5, e7 , 4, e9, 5, e8 , 4, e2 , 1] este un ciclu (circuit) simplu si neelementar (contine de doua ori 2), de lungime 7.
Pentru graful orientat simplu din Exemplul 1.2.2, [3, 1, 2, 4, 5] este un lant
ce nu este drum (deoarece (4, 5) nu este arc, ci (5, 4)), iar (3, 1, 2, 5, 4) este
un drum (si lant) deschis elementar (si simplu) de lungime 4. In acelasi
graf, (1, 2, 3, 1) este un circuit (si ciclu) elementar, iar [2, 5, 4, 2] este un ciclu
elementar ce nu este circuit (deoarece (4, 2) nu este arc, ci (2, 4)).
Definitia 1.5.2. a) Un graf (neorientat sau orientat) se numeste conex
daca pentru orice doua noduri distincte x, y exista cel putin un lant de
la x la y.
b) Un graf orientat se numeste tare-conex daca pentru orice doua noduri
distincte x, y exista cel putin un drum de la x la y (deci, schimband
ordinea lui x si y, exista cel putin un drum si de la y la x).
Observatia 1.5.4. Orice graf tare-conex este si conex (deoarece orice drum
este si lant). Orice graf cu un singur nod verifica definitia anterioara, deci
este si conex si tare-conex.
Observatia 1.5.5. Deoarece pentru orice nod x exista lantul [x] si drumul (x)
de lungimi zero, rezulta ca n definitia anterioara putem renunta la conditiile
ca nodurile x si y sa fie distincte.
De asemenea, deoarece prin eliminarea tuturor portiunilor dintre noduri
egale dintr-un lant sau drum se obtine un lant sau un drum elementar avand
aceleasi extremitati, rezulta ca n definitia anterioara putem nlocui termenii
de lant si drum cu lant elementar, respectiv drum elementar.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

21

Exemplul 1.5.2. Graful neorientat din Exemplul 1.2.1 nu este conex, deoarece
nu exista lanturi ntre nodurile 1 si 3. Graful orientat din Exemplul 1.2.2
este conex, dar nu este tare-conex, deoarece nu exista drum de la nodul 4 la
nodul 1 (desi exista drum de la nodul 1 la nodul 4!).
Definitia 1.5.3. a) O component
a conex
a a unui graf (orientat sau
neorientat) G = (V, E) este un subgraf G[U] generat de o submultime
U V de noduri cu proprietatea ca G[U] este conex si maximal cu
aceasta proprietate (n raport cu incluziunea), adica pentru orice nod
x V \ U subgraful G[U {x}] nu mai este conex.
b) O component
a tare-conex
a a unui graf orientat G = (V, E) este un
subgraf G[U] generat de o multime U V de noduri cu proprietatea
ca G[U] este tare-conex si maximal cu aceasta proprietate (n raport cu
incluziunea), adica pentru orice noduri x1 , x2 , . . . , xp V \ U subgraful
G[U {x1 , x2 , . . . , xp }] nu mai este tare-conex.
Observatia 1.5.6. Un graf este conex daca si numai daca are o singura componenta conexa. Un graf orientat este tare-conex daca si numai daca are o
singura componenta tare-conexa. Numarul de componente tare-conexe ale
unui graf orientat este mai mare sau egal decat numarul de componente
conexe ale acelui graf, deoarece orice componenta tare-conexa este inclusa
ntr-o componenta conexa (conform definitiei anterioare si Observatiei 1.5.4).
Observatia 1.5.7. Orice nod izolat x genereaza o componenta conexa si o
componenta tare-conexa, ambele avand forma G[{x}] = ({x}, ).
Propozitia 1.5.1. a) Fie G[V1 ], . . . , G[Vk ] componentele conexe (diferite)
ale unui graf G = (V, E). Atunci {V1 , . . . , Vk } este o partitie a multimii
V (adica Vi 6= i, Vi Vj = i 6= j, V1 Vk = V ).
b) Fie G[V1 ], . . . , G[Vr ] componentele tare-conexe (diferite) ale unui graf
orientat G = (V, E). Atunci {V1 , . . . , Vr } este de asemenea o partitie
a multimii V .
Exemplul 1.5.3. Componentele conexe ale grafului neorientat din Exemplul
1.2.1 sunt generate de submultimile de noduri V1 = {1, 2, 4, 5} si V2 = {3, 6},
deci acel graf are 2 componente conexe. Componentele tare-conexe ale grafului orientat din Exemplul 1.2.2 sunt generate de submultimile de noduri
V1 = {1, 2, 3}, V2 = {4} si V3 = {5}, deci acel graf are 3 componente tareconexe.
Observatia 1.5.8. Submultimile de muchii sau arce ale componentelor conexe
ale unui graf formeaza de asemenea o partitie a multimii de muchii sau arce

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

22

a grafului (deoarece pentru orice muchie e = [x, y] sau arc e = (x, y) nodurile
x si y se afla ntr-o aceeasi componenta conexa si aceasta componenta va
contine si pe e). Afirmatia nu mai este valabila pentru componentele tareconexe. De exemplu, pentru graful din Exemplul 1.2.2 arcul (5, 4) nu apartine
nici-unei componente tare-conexe.
Definitia 1.5.4.

a) Un arbore este un graf conex si fara cicluri.

b) O p
adure este un graf fara cicluri.
c) Un arbore partial al unui graf G = (V, E) este un graf partial al lui
G ce este arbore (adica un arbore T = (V, F ) cu F E).
Observatia 1.5.9. Arborii si padurile sunt grafuri simple (deoarece orice bucla
este un ciclu si orice doua muchii sau arce multiple formeaza un ciclu).
Observatia 1.5.10. Componentele conexe ale unei paduri sunt arbori.
Exemplul 1.5.4. Graful neorientat din Exemplul 1.2.1 nu este padure (deoarece are cicluri), deci nici arbore. Graful sau partial reprezentat n Figura
1.5.1 este o padure (avand doua componente conexe arbori). Graful orientat
din Exemplul 1.2.2 nu este arbore (deoarece are cicluri). Doi arbori partiali
ai sai sunt reprezentati n Figura 1.5.2.
1

e1

e2

e4

e5
6

Figura 1.5.1:
1
5

Figura 1.5.2:

2
5

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

1.6

23

Parcurgerea grafurilor

Prin parcurgerea unui graf se ntelege o metoda sistematica de vizitare succesiva a nodurilor sale (n vederea prelucrarii informatiilor atasate n structura
de date modelata prin graful dat).
Definitia 1.6.1. Fie G = (V, E) un graf si x V un nod arbitrar fixat.
Parcurgerea n ad
ancime (DF, depth first) a grafului G pornind din
nodul x, numit si r
ad
acin
a a acestei parcurgeri, consta n:
se vizitez
a nodul x, acesta devine nod curent;
daca nodul curent vi are succesori directi (adica noduri vj pentru care
exista muchie sau arc de la vi la vj ) nevizitati, atunci se viziteaza primul
astfel de nod vj ; nodul vj devine nod curent si se continua procedeul de
parcurgere pornind din acest nod;
daca nodul curent vj nu mai are succesori directi nevizitati, atunci se
revine la nodul predecesor direct vi (cel din care a fost vizitat); nodul vi
redevine nod curent si se continua procedeul de parcurgere pornind din
acest nod;
daca nodul curent nu mai are nici succesori directi nevizitati, nici predecesor direct (deci este chiar radacina x), atunci parcurgerea se ncheie.
Observatia 1.6.1. Pentru parcurgerea DF, considerand cate o muchie sau un
arc de la fiecare nod curent vi la primul sau succesor direct nevizitat vj (care
va deveni urmatorul nod curent) se obtine un arbore, numit arbore DF.
Exemplul 1.6.1. Pentru graful din Exemplul 1.2.2, parcurgerea n adancime
pornind din nodul 2 este
DF (2) : 2, 3, 1, 4, 5
(considerand ca ordinea dintre succesorii directi ai fiecarui nod este ordinea
crescatoare). Arborele DF corespunzator acestei parcurgeri este reprezentat
n Figura 1.6.1.
Pentru acelasi graf, parcurgerea DF pornind din nodul 3 este
DF (3) : 3, 1, 2, 4, 5,
iar arborele DF corespunzator este reprezentat n Figura 1.6.2.
Prezentam n continuare doi algoritmi, unul recursiv si altul nerecursiv,
pentru implementarea parcurgerii n adancime.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

24

Figura 1.6.1:
3

Figura 1.6.2:

Algoritmul 1.6.1 (parcurgerea DF, recursiv). Fie graful G = (V, E) avand


multimea de noduri V = {1, . . . , n} si matricea de adiacenta A = (aij )i,j=1,n .
Fie x V un nod arbitrar fixat. Pentru implementarea parcurgerii DF (x)
vom utiliza un vector V IZ avand semnificatia

1, daca nodul i a fost vizitat,
V IZ[i] =
i {1, . . . , n}.
0, n caz contrar,
Pentru memorarea arborelui DF (x) vom utiliza un vector T AT A avand
semnificatia

0, daca i = x (radacina),
T AT A[i] =
predecesorul direct al lui i, daca i 6= x,

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

25

pentru orice nod i din parcurgerea DF . Descrierea n pseudocod a algoritmului recursiv de parcurgere n adancime pornind din nodul x are urmatoarea
forma.
DF RECURSIV(x) :

VIZITEAZA(x);
// se viziteaz
a x, de exemplu se afi
seaz
a x
V IZ[x] 1;
// x a fost vizitat
for y = 1, n do
if (axy 1) and (V IZ[y] = 0) then
// y este primul succesor direct nevizitat al lui x
T AT A[y] x;
DF RECURSIV(y);
// se continu
a parcurgerea DF
// din nodul y

Programul C++ corespunzator, cu citirea grafului dintr-un fisier (avand


pe prima linie numerele n de noduri si m de muchii sau arce ale grafului si
pe liniile urmatoare perechile de noduri ce formeaza aceste muchii sau arce)
si afisarea parcurgerii DF (x) si a vectorului T AT A (ce memoreaza arborele
DF (x)) este:
#include<iostream.h> //parcurgerea DF a unui graf, recursiv
#include<conio.h>
#include<fstream.h>
#define nmax 50
// nr. maxim de noduri
int n,m,A[nmax][nmax],VIZ[nmax],TATA[nmax];
void citire_graf()
// citirea grafului din fisierul "graf2.dat"
{ int i,j,k;
ifstream f("graf2.dat");
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) A[i][j]=0;
for(k=1;k<=m;k++)
{ f>>i>>j;
A[i][j]++;
// if (j!=i) A[j][i]++;
// doar pt. grafuri NEORIENTATE
}
f.close();
}
void viziteaza(int x)
// vizitarea nodului x
{ cout<<x<<" ";
}
void DF_recursiv(int x) // parcurgerea DF pornind din nodul x
{ int y;
viziteaza(x);

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

26

VIZ[x]=1;
for(y=1;y<=n;y++)
if ((A[x][y]>=1)&&(VIZ[y]==0))
{ TATA[y]=x;
DF_recursiv(y);
}
}
void main()
{ int x,i;
clrscr();
citire_graf();
for(i=1;i<=n;i++)
{ VIZ[i]=0; TATA[i]=0;
}
cout<<"Nodul de pornire: x=";cin>>x;
cout<<"Parcurgerea DF: ";
DF_recursiv(x);
cout<<"\nArborele DF este dat de vectorul TATA: ";
for (i=1;i<=n;i++) cout<<TATA[i]<<" ";
getch();
}

Exemplul 1.6.2. Pentru graful din Exemplul 1.2.2, fisierul de intrare graf2.dat
folosit la citirea grafului n programul anterior contine datele:
5 7
//5 noduri si 7 arce
1 2
//arcul (1, 2)
2 3
//arcul (2, 3)
2 4
//arcul (2, 4)
2 5
//arcul (2, 5)
3 1
//arcul (3, 1)
3 2
//arcul (3, 2)
5 4
//arcul (5, 4).
Algoritmul 1.6.2 (parcurgerea DF, nerecursiv). Fie din nou G = (V, E)
un graf avand multimea de noduri V = {1, . . . , n} si matricea de adiacenta
A = (aij )i,j=1,n . Fie x V un nod arbitrar fixat. Pentru implementarea nerecursiva a parcurgerii DF (x) vom utiliza vectorii V IZ si T AT A cu aceleasi
semnificatii ca n algoritmul anterior, un vector URM cu semnificatia
URM[i] = urmatorul succesor direct al nodului i,
si o structura de tip stiv
a S, memorata ca un vector, ce contine nodurile
vizitate si n curs de prelucrare, adica de vizitare a tuturor succesorilor.
Descrierea n pseudocod a algoritmului are urmatoarea forma.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

27

DF(x) :

VIZITEAZA(x);
// se viziteaz
a x, de exemplu se afi
seaz
a x
V IZ[x] 1;
// x a fost vizitat
T AT A[x] 0;
varf 1; S[varf ] x;
// x se introduce ^
n v^
arful stivei
while (varf > 0) do
// stiva este nevid
a
i S[varf ];
// i este nodul din v^
arful stivei
j URM[i] + 1;
// j va fi urm
atorul succesor direct
// nevizitat al lui i, dac
a exist
a
while (aij = 0) and (j n) do j j + 1;
if (j > n) then
// nodul i nu mai are succesori direct
i nevizitat
i
varf varf 1;
// s-a ^
ncheiat prelucrarea lui i
//
si ^
l elimin
am din stiv
a
else
URM[i] j;
// j este urm
atorul succesor direct
// al lui i
if (V IZ[j] = 0) then
// j nu a fost vizitat

VIZITEAZA(j);
// se viziteaz
a j
V IZ[j] 1;
// j a fost vizitat
T AT A[j] i;
varf varf + 1;
S[varf ] j;
// se introduce j ^
n v^
arful stivei
// stiva este vid
a, nu mai exist
a noduri neprelucrate,
// parcurgerea este
^ncheiat
a.
Observatia 1.6.2. Pentru un graf cu n noduri si m muchii sau arce, implementarea anterioara a parcurgerii DF are complexitatea O (n2 ), deoarece
oricare din cele n noduri este vizitat (deci introdus si extras din stiva) cel
mult cate o data, iar cautarea succesorilor directi j nevizitati ai fiecarui nod
i extras din stiva se efectueaza n cel mult n pasi, prin parcurgerea liniei i
din matricea de adiacenta.
Daca graful este memorat prin intermediul listelor de adiacenta, atunci
cautarea succesorilor directi j nevizitati ai fiecarui nod i extras din stiva se
efectueaza, prin parcurgerea lor succesiva, n exact d(i) (pentru graf neorientat) sau d+ (i) (pentru graf orientat) pasi. Cum, conform Propozitiei 1.4.2,
P
P +
d(x) = 2m si
d (x) = m, obtinem ca n acest caz parcurgerea DF
xV

xV

are complexitatea O (n + m).

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

28

Observatia 1.6.3. Daca G = (V, E) este un graf neorientat, atunci pentru


orice nod x V componenta conexa a nodului x este (indusa de) chiar
multimea nodurilor vizitate prin parcurgerea DF (x).
Pe baza acestei observatii obtinem urmatorul algoritm.
Algoritmul 1.6.3 (determinarea componentelor conexe). Fie din nou
G = (V, E) un graf neorientat, V = {1, . . . , n} si fie A = (aij )i,j=1,n matricea
de adiacenta a grafului G. Pentru determinarea componentelor conexe ale
grafului G vom utiliza un vector CC cu semnificatia
CC[i] = numarul componentei conexe n care se afla nodul i,
i {1, . . . , n} si o variabila nrc ce reprezinta numarul de componente
conexe. Evident, graful G este conex daca si numai daca valoarea finala a
variabilei nrc este egala cu 1.
Descrierea n pseudocod a algoritmului are forma urmatoare.
COMPONENTE CONEXE :
nrc 0;
for i = 1, n do CC[i] 0;
for i = 1, n do
if (CC[i] = 0) then
// nodul i nu a fost vizitat
nrc nrc + 1;
// nodurile din parcurgerea DF (i)
DF(i);
// vor forma o nou
a component
a conex
a

unde functia DF(i) este cea din Algoritmul 1.6.1 sau cea din Algoritmul

1.6.2, adaugand instructiunea CC[i] nrc n functia VIZITEAZA(i).

Observatia 1.6.4. Algoritmul anterior poate fi utilizat si pentru determinarea


componentelor conexe ale unui graf orientat, nlocuind conditia axy 1 din
functia DF RECURSIV(x) cu axy 1 sau ayx 1, respectiv conditia
aij = 0 din functia DF(x) cu aij = 0 si aji = 0 (deoarece n determinarea
componentelor conexe nu se tine cont de orientarea arcelor).
Observatia 1.6.5. Daca G = (V, E) este un graf orientat, atunci pentru orice
nod x V componenta tare-conexa a nodului x este (indusa de) multimea
nodurilor y vizitate prin parcurgerea DF (x) a grafului G cu proprietatea ca
y este vizitat si n parcurgerea DF (x) a grafului
G = (V, E), unde E = {(j, i)|(i, j) E},
numit transpusul (simetricul) lui G. Evident, orice drum (y, v1 , . . . , vk , x)
n graful G corespunde drumului (x, vk , . . . , v1 , y) n graful G, deci x si y

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

29

sunt n aceeasi componenta tare-conexa a lui G daca si numai daca exista un


drum de la x la y n G si un drum de la x la y n G, adica y este vizitat prin
parcurgerea DF (x) atat n G cat si n G.
Matricea de adiacenta a grafului G este transpusa matricei de adiacenta
a grafului G, deci pentru parcurgerea DF (x) a grafului G putem utiliza
tot matricea de adiacenta A a grafului dat G, nlocuind conditia aij = 0
cu aji = 0, iar conditia axy 1 cu ayx 1 n functiile DF(x),
respectiv DF RECURSIV(x). Astfel, algoritmul DF poate fi utilizat si
pentru determinarea componentelor tare-conexe, deci si pentru verificarea
tare-conexitatii grafului.
Definitia 1.6.2. Fie G = (V, E) un graf si x V un nod arbitrar fixat.
Parcurgerea n l
atime (BF,breadth first, parcurgerea pe nivele) a
grafului G pornind din nodul x, numit si r
ad
acin
a a acestei parcurgeri,
consta n:
se vizitez
a nodul x, considerat nod de nivelul zero;
se viziteaza apoi succesorii directi nevizitati ai acestuia (diferiti de x),
considerati noduri de nivelul 1;
se viziteaza apoi, pe rand, succesorii directi nevizitati ai acestora, considerati noduri de nivelul 2;
s.a.m.d.;
parcurgerea se ncheie cand nici-un nod de pe un nivel nu mai are
succesori directi nevizitati.
Observatia 1.6.6. Analog parcurgerii DF, considerand cate o muchie sau un
arc de la fiecare nod curent v al parcurgerii BF la fiecare din nodurile nevizitate (de pe urmatorul nivel) pentru care v este predecesorul direct, se obtine
un arbore, numit arbore BF.
Exemplul 1.6.3. Pentru graful din Exemplul 1.2.2, parcurgerea n latime
pornind din nodul 2 este
BF (2) : 2, 3, 4, 5, 1
(considerand din nou ordinea dintre succesorii directi ai fiecarui nod ca fiind ordinea crescatoare). Arborele BF corespunzator acestei parcurgeri este
reprezentat n Figura 1.6.3. Pentru acelasi graf, parcurgerea BF pornind din
nodul 3 este
BF (3) : 3, 1, 2, 4, 5,
iar arborele BF corespunzator este reprezentat n Figura 1.6.4.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

30

Figura 1.6.3:
3

2
1

Figura 1.6.4:

Algoritmul 1.6.4 (parcurgerea BF). Fie graful G = (V, E) avand multimea


de noduri V = {1, . . . , n} si matricea de adiacenta A = (aij )i,j=1,n . Fie x V
un nod arbitrar fixat. Pentru implementarea parcurgerii BF (x) vom utiliza
vectorii V IZ, T AT A, URM si S avand aceleasi semnificatii ca la parcurgerea
DF (x) (Algoritmul 1.6.2), cu deosebirea ca vectorul S al nodurilor vizitate
si n curs de prelucrare este organizat si utilizat acum ca o structura de tip
coad
a.
Aceasta fiind singura modificare fata de Algoritmul 1.6.2, obtinem urmatoarea descriere n pseudocod a algoritmului de parcurgere n latime.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

31

BF(x) :

VIZITEAZA(x);
V IZ[x] 1;
T AT A[x] 0;
coada 1;
// nodurile se adaug
a la S pe pozit
ia "coada "
varf 1;
//
si se elimin
a de pe pozit
ia "varf "
S[coada] x;
while (varf coada) do
// coada este nevid
a
i S[varf ];
j URM[i] + 1;
while (aij = 0) and (j n) do j j + 1;
if (j > n) then
varf varf + 1;
else
URM[i] j;
if (V IZ[j] = 0) then

VIZITEAZA(j);
V IZ[j] 1;
T AT A[j] i;
coada coada + 1;
S[coada] j;

Observatia 1.6.7. Analog parcurgerii DF, implementarea anterioara a parcurgerii BF are complexitatea O (n2 ), iar daca graful este memorat prin
intermediul listelor de adiacenta, atunci complexitatea este O (n + m).
Observatia 1.6.8. Observatiile 1.6.3, 1.6.4 si 1.6.5 si algoritmii corespunzatori
raman valabile daca nlocuim parcurgerea DF cu parcurgerea BF.

Tema 2
Metoda Greedy
2.1

Descrierea metodei. Algoritmi generali

Metoda Greedy (a optimului local) presupune elaborarea unor strategii


de rezolvare a problemelor de optim, n care se urmareste maximizarea sau
minimizarea unei functii obiectiv.
Se aplica problemelor n care se da o multime finita A = {a1 , a2 , . . . , an }
(multimea de candidati), continand n date de intrare, pentru care se cere
sa se determine o submultime B A care sa ndeplineasca anumite conditii
pentru a fi acceptata. Aceasta submultime se numeste solutie posibil
a.
Deoarece, n general, exista mai multe solutii posibile, trebuie avut n
vedere si un criteriu de selectie, conform caruia, dintre acestea, sa fie aleasa
una singura ca rezultat final, numita solutie optim
a.
Solutiile posibile au urmatoarele proprietati:
multimea vida este ntotdeauna solutie posibila;
daca B este solutie posibila si C B, atunci si C este solutie posibila.
In continuare sunt prezentate doua scheme de lucru, care urmeaza aceeasi
idee, diferentiindu-se doar prin ordinea de efectuare a unor operatii:
Algoritmul 2.1.1 (Metoda Greedy, varianta I).
Se pleaca de la solutia vida ();
Se alege, pe rand, ntr-un anumit fel, un element din A neales la pasii
precedenti.
Daca includerea elementului ales n solutia partiala construita anterior conduce la o solutie posibila, atunci construim noua solutie prin
adaugarea elementului ales.
32

TEMA 2. METODA GREEDY

33

GREEDY1(A, n, B) :
B ;
for i = 1, n do
x ALEGE(A, i, n);
if SOLUTIE POSIBILA (B, x) then
B B {x};
Observatia 2.1.1.
Functia ALEGE(A, i, n) returneaza un element x = aj {ai , . . . , an }
si efectueaza interschimbarea ai aj ;
Functia SOLUTIE POSIBILA(B, x) verifica daca B{x} este solutie
posibila a problemei.
Functia ALEGE este cea mai dificil de realizat, deoarece trebuie sa
implementeze criteriul conform caruia alegerea la fiecare pas a cate
unui candidat sa conduca n final la obtinerea solutiei optime.
Algoritmul 2.1.2 (Metoda Greedy, varianta a II-a).
Metoda e asemanatoare primeia, cu exceptia faptului ca se stabileste de
la nceput ordinea n care trebuie analizate elementele din A.
GREEDY2(A, n, B) :
PRELUCREAZA (A, n);
B ;
for i = 1, n do
if SOLUTIE POSIBILA (B, ai ) then
B B {ai };
Observatia 2.1.2. Prin apelul procedurii PRELUCREAZA(A, n) se efectueaza o permutare a elementelor multimii A, stabilind ordinea de analiza a
acestora. Aceasta este procedura cea mai dificil de realizat.
Observatia 2.1.3.
Metoda Greedy nu cauta sa determine toate solutiile posibile si apoi
sa aleaga pe cea optima conform criteriului de optimizare dat (ceea ce
ar necesita n general un timp de calcul si spatiu de memorie mari), ci
consta n a alege pe rand cate un element, urmand sa-l nghita eventual n solutia optima. De aici vine si numele metodei (Greedy = lacom).

34

TEMA 2. METODA GREEDY

Astfel, daca trebuie determinat maximul unei functii de cost depinzand


de a1 , . . . , an , ideea generala a metodei este de a alege la fiecare pas acel
element care face sa creasca cat mai mult valoarea acestei functii. Din
acest motiv metoda se mai numeste si a optimului local.
Optimul global se obtine prin alegeri succesive, la fiecare pas, ale optimului local, ceea ce permite rezolvarea problemelor fara revenire la
deciziile anterioare (asa cum se ntampla la metoda backtracking).
In general metoda Greedy ofera o solutie posibila si nu ntotdeauna
solutia optima. De aceea, daca problema cere solutia optima, algoritmul trebuie sa fie nsotit si de justificarea faptului ca solutia generata
este optima.
Exemplul 2.1.1. Se da o multime A = {a1 , a2 , . . . , an } cuPai R, i = 1, n. Se
b sa fie maxima.
cere sa se determine o submultime B A, astfel ncat
bB

Rezolvare. Daca B A si b0 B, cu b0 0, atunci


X
X
b
b.
bB

bB\{b0 }

Rezulta ca putem ntelege prin solutie posibil


a o submultime B a lui A
cu toate elementele strict pozitive.
Vom aplica metoda Greedy, n varianta I, n care
functia ALEGE furnizeaza x = ai ;
functia SOLUTIE POSIBILA returneaza 1 (adevarat) daca x > 0
si 0 (fals) n caz contrar.
ALEGE (A, i, n) :
x ai ;
returneaz
a x;
SOLUTIE POSIBILA(B, x) :
if x > 0 then
returneaz
a 1;
else
returneaz
a 0;

// adev
arat
// fals


35

TEMA 2. METODA GREEDY

2.2

O problem
a de maxim/minim

Se considera sirurile de numere reale


a1 , a2 , . . . , an si b1 , b2 , . . . , bn , n 1.
Se cere sa se determine doua permutari , Sn (Sn = grupul permutarilor
de ordin n) astfel ncat:
n
X
a)
a(i) b(i) sa fie maxima;
i=1

b)

n
X
i=1

a(i) b(i) sa fie minima.

Pentru rezolvarea acestei probleme, vom demonstra mai ntai urmatoarea


lema.
Lema 2.2.1. Fie sirurile crescatoare de numere reale
a1 a2 . . . an si b1 b2 . . . bn , n 1.
Atunci n
n
X
X
ak b(k) ;
a)
ak bk = max
b)

k=1
n
X
k=1

Sn

k=1

ak bnk+1 = min

Sn

n
X
k=1

ak b(k) .

Demonstratie. a) Vom arata ca maximul din relatia de demonstrat se atinge


si pentru permutarea identica.
Pentru o permutare Sn , vom folosi notatia
S() =

n
X
k=1

ak b(k) .

Fie Sn astfel ncat


S() = max
Sn

n
X
k=1

ak b(k) ,

(2.2.1)

adica este o permutare pentru care se realizeaza maximul.


Presupunem ca 6= e (permutarea identica). Rezulta ca
i, j astfel ncat i < j si (i) > (j).

(2.2.2)

36

TEMA 2. METODA GREEDY


(Obs. Pentru permutarea identica, e Sn , avem e(i) < e(j) , i < j).
|{z} |{z}
i

Din (2.2.2), deoarece sirurile date sunt crescatoare, rezulta ca


b(i) b(j) .

(2.2.3)

Pornind de la , construim permutarea Sn




1
2
...
i
... j
...
n

=
,
(1) (2) . . . (j) . . . (i) . . . (n)

adica

(k) = (k), k cu k 6= i si k 6= j,
(i) = (j),
(j) = (i).
Calculam
S() S( ) =

n
X
k=1

ak b(k)

n
X
k=1

ak b (k) =

= ai b(i) + aj b(j) ai b (i) aj b (j) =


= ai b(i) + aj b(j) ai b(j) aj b(i) =


= ai b(i) b(j) + aj b(j) b(i) =

= b(i) b(j) (ai aj ) 0.
{z
} | {z }
|
0

Rezulta ca S() S( ). Insa, din (2.2.1), nu putem avea inegalitate


stricta. Prin urmare S() = S( ). In plus, (k) = (k), k cu k 6=
i si k 6= j, si (i) < (j).
In continuare, daca 6= e, se reia rationamentul precedent pentru permutarea , obtinandu-se o permutare pentru care
S() = S( ) = S( ).
Dupa un numar finit de pasi, se va obtine permutarea identica e pentru care
vom avea ca
n
n
X
X
ak bk .
ak be(k) =
S() = S(e) =
k=1

k=1

T
inand seama de relatia (2.2.1), obtinem ca
n
X
k=1

ak bk = max
Sn

b) Se demonstreaza n mod analog.

n
X
k=1

ak b(k) .

37

TEMA 2. METODA GREEDY

Lema 2.2.1 justifica urmatoarea strategie Greedy pentru rezolvarea problemei:


a) La fiecare pas (pentru obtinerea celor n termeni ai sumei) se vor lua
(pentru mperechere):
cel mai mic dintre termenii sirului (ai )i=1,n neales la pasii precedenti;

cel mai mic dintre termenii sirului (bj )j=1,n neales la pasii precedenti.
b) La fiecare pas (pentru obtinerea celor n termeni ai sumei) se vor lua:
cel mai mic (mare) dintre termenii sirului (ai )i=1,n neales la pasii
precedenti;
cel mai mare (mic) dintre termenii sirului (bj )j=1,n neales la pasii
precedenti.

2.3

Memorarea optimal
a a textelor pe benzi

Se da o banda magnetica suficient de lunga pentru a memora n texte (fisiere)


de lungimi date (n octeti):
L1 , L2 , . . . , Ln .
De fiecare data, pentru a citi un anumit text de pe banda, trebuie citite si
textele aflate naintea lui. Presupunand ca frecventa de citire a celor n texte
este aceeasi, se cere sa se determine ordinea de pozitionare (memorare) a
acestora pe banda, astfel ncat timpul mediu de citire sa fie optim (cat mai
mic).
Consideratii:
Timpul de citire a unui text este direct proportional cu lungimea lui.
Prin urmare, putem presupune ca timpul de citire efectiva a unui text
este egal cu lungimea lui.
Fiecarei pozitionari pe banda a celor n texte i corespunde o permutare
p Sn . Asadar, textul k apare al p(k)lea, fiind precedat de textele cu
numerele de ordine p(1), p(2),...,p(k 1).
Citirea textului k necesita timpul Tk =

k
X
i=1

Lp(i) , adica la timpul de

citire efectiva a textului k trebuie adaugati si timpii de citire a textelor


precedente.

38

TEMA 2. METODA GREEDY


Rezulta ca timpul mediu de citire va fi

Tmediu =

n
X

Tk

k=1

n X
k
X
k=1 i=1

Lp(i)
.

Deoarece numitorul are valoare constanta n, va trebui sa obtinem o


valoare minima pentru numarator.
Pentru o permutare p Sn , notam (p) :=
(p) =

n X
k
X

n X
k
X

Lp(i) . Atunci

k=1 i=1

Lp(i) =

k=1 i=1

n
X
k=1


Lp(1) + Lp(2) + + Lp(k) =




= Lp(1) + Lp(1) + Lp( 2) + + Lp(1) + Lp(2) + + Lp(n) =
= n Lp(1) + (n 1) Lp(2) + + 2 Lp(n1) + 1 Lp(n) =
n
X
(n k + 1) Lp(k) .
=
k=1

Propozitia 2.3.1. Daca L1 L2 . . . Ln , atunci pozitionarea pe banda


corespunzatoare permutarii identice (notata e) este optima.
Demonstratie. Avem
(e) =
=

n
X

k=1
n
X
k=1

(n k + 1) Le(k) =

n
X
k=1

(n k + 1) Lk =

Lk (n k + 1).

Aplicand Lema 2.2.1 b) pentru sirurile L1 L2 . . . Ln si 1, 2, . . . , n,


obtinem
(e) = min ().
Sn

Propozitia justifica urmatoarea strategie Greedy:

39

TEMA 2. METODA GREEDY

La fiecare pas este ales textul de lungime minima dintre cele ramase la
pasii precedenti, care va fi apoi memorat pe banda;
Deci textele vor fi memorate pe banda n ordinea crescatoare a lungimilor lor.

2.4

Arbori partiali de cost minim

Definitia 2.4.1. Un graf ponderat este o pereche (G, c), unde G = (V, E)
este un graf iar c : E R este o functie numita pondere (cost). Pentru
orice e E, c(e) se numeste ponderea (costul) muchiei sau arcului e.
Definitia 2.4.2. Fie (G, c) un graf ponderat, G = (V, E).
a) Daca H = (U, F ) este un subgraf al lui G, atunci costul (ponderea)
lui H este
X
c(H) =
c(e)
eF

(adica suma costurilor muchiilor sau arcelor sale).

b) Un arbore partial T = (V, F ) al lui G cu proprietatea ca


c(T ) = min{c(T )|T = arbore partial al lui G}
se numeste arbore partial de cost minim (APM) al grafului ponderat (G, c).
Observatia 2.4.1. Un graf ponderat are arbori partiali de cost minim daca si
numai daca este conex.
Problema determinarii arborilor partiali de cost minim are numeroase
aplicatii practice. Prezentam n continuare doi algoritmi fundamentali pentru
rezolvarea acestei probleme.
Algoritmul 2.4.1 (Kruskal). Fie (G, c) un graf ponderat conex cu G =
(V, E), V = {v1 , . . . , vn }. Algoritmul are n 1 pasi.
La pasul i, i = 1, n 1, dintre muchiile neselectate la pasii anteriori
se selecteaza o muchie ei E de cost minim cu proprietatea ca nu
formeaza cicluri cu muchiile {e1 , . . . , ei1 } selectate la pasii anteriori.
Algoritmul 2.4.2 (Prim). Fie (G, c) un graf ponderat conex cu G = (V, E),
V = {v1 , . . . , vn }. Algoritmul are n pasi.
La pasul 0 se selecteaza un nod arbitrar x0 V .

TEMA 2. METODA GREEDY

40

La pasul i, i = 1, n 1, se selecteaza o muchie ei = [xj , xi ] E de cost


minim cu proprietatea ca are ca extremitati un nod xj V selectat la
un pas anterior si celalalt nod xi V neselectat la pasii anteriori; se
selecteaza si nodul xi .
Teorema 2.4.1 (de corectitudine a algoritmilor Kruskal si Prim). In
contextul Algoritmilor Kruskal sau Prim, fie F = {e1 , . . . , en1 } multimea
muchiilor selectate. Atunci T = (V, F ) este un arbore partial de cost minim
al grafului ponderat (G, c).
Demonstratie. Vom prezenta o demonstratie comuna a corectitudinii celor
doi algoritmi. Fie T0 = (V, ) si Ti = (V, {e1 , . . . , ei }), i {1, 2, . . . , n 1},
unde e1 , e2 , . . . , en1 sunt muchiile selectate, n aceasta ordine, de Algoritmul
Kruskal sau de Algoritmul Prim.
Graful G fiind conex, selectarea muchiei ei este posibila la fiecare pas i,
iar Ti este o padure partiala a lui G (afirmatie evidenta pentru Algoritmul
Kruskal, iar pentru Algoritmul Prim este o consecinta a faptului ca nodurile
neselectate la pasul i sunt izolate n Ti ).
Demonstram prin inductie dupa i {0, 1, . . . , n 1} ca exista un APM
T = (V, F ) astfel ncat
Ti T (adica {e1 , . . . , ei } F ).

(2.4.1)

Pentru i = 0 afirmatia este evidenta, luand T orice APM (exista, deoarece


G este conex).
Presupunem (2.4.1) adevarata pentru i 1, adica exista T = (V, F )
APM cu Ti1 T si o demonstram pentru i (i {1, 2, . . . , n 1}).
Fie ei = [xj , xi ] muchia selectata de Algoritmul Kruskal sau de Algoritmul
Prim la pasul i. In cazul Algoritmului Prim, xj este nodul selectat la un pas
anterior (j i 1). Avem doua cazuri.
Cazul 1) ei F . Atunci {e1 , . . . , ei } F , deci Ti T .
Cazul 2) ei 6 F . Conform Teoremei numarului ciclomatic, graful H =
T + ei = (V, F {ei }) obtinut din T prin adaugarea muchiei ei contine un
ciclu elementar unic
Ci = [xj , w0 , . . . , wk , xi , xj ]
avand ultima muchie chiar muchia ei . Cum Ti = Ti1 + ei este o padure,
rezulta ca xj si xi sunt n componente conexe diferite ale lui Ti1 (n caz
contrar Ti ar contine un ciclu de forma [xj , y0, . . . , yr , xi , xj ] avand ultima
muchie ei ). Rezulta ca lantul elementar
i = [xj , w0 , . . . , wk , xi ]

TEMA 2. METODA GREEDY

41

(obtinut din ciclul Ci prin eliminarea muchiei ei ) contine o muchie ei = [x , y ]


astfel ncat x este n aceeasi componenta conexa cu xj n padurea Ti1 , iar y
nu este n aceasta componenta conexa. Evident, rezulta ca ei nu este muchie
a lui Ti1 , adica ei 6 {e1 , . . . , ei1 }, iar graful Ti = Ti1 + ei nu contine
cicluri. De asemenea, ei 6= ei , deci ei F .
Pe de o parte, din descrierea Algoritmului Kruskal deducem ca
c(ei ) c(ei )
(deoarece muchia ei nu formeaza cicluri cu {e1 , . . . , ei1 }, deci ei fiind muchia
selectata la pasul i verifica aceasta inegalitate).
Pe de alta parte, din descrierea Algoritmului Prim deducem ca la pasul
i nodul x era deja selectat la un pas anterior (fiind n aceeasi componenta
conexa cu xj n Ti1 ), iar nodul y nu era selectat la un pas anterior (nefiind
n acea componenta conexa), deci din nou avem
c(ei ) c(ei )
(ei fiind muchia selectata la pasul i verifica aceasta inegalitate).
Continuam demonstratia comuna pentru cei doi algoritmi. Fie
T = (T + ei ) ei
graful partial al lui G obtinut din T prin adaugarea muchiei ei si eliminarea
muchiei ei , adica T = (V, F ), unde F = F {ei } \ {ei }.
Evident, T este conex (T este conex iar ntre nodurile x si y dupa eliminarea muchiei ei ramane lantul obtinut din ciclul Ci prin eliminarea acestei
muchii) si are n1 muchii (deoarece T are n1 muchii). Conform Teoremei
numarului ciclomatic rezulta ca T este un arbore partial al grafului G.
Deoarece c(ei ) c(ei ) obtinem
c(T ) c(T )
si cum T este un APM rezulta ca si T este un APM (si, n plus, c(T ) =
c(T )). Cum Ti T , demonstratia prin inductie a relatiei (2.4.1) este
completa.
Luand i = n 1 n aceasta relatie obtinem ca T T , unde T = Tn1 =
(V, F ), F = {e1 , . . . , en1 } (multimea muchiilor selectate de algoritm) iar T
este un APM. Dar T si T au fiecare cate n 1 muchii, deci T = T si astfel
T este un APM al grafului dat.
Exemplul 2.4.1. Fie graful ponderat (G, c) reprezentat n Figura 2.4.1, unde
costul fiecarei muchii este scris langa segmentul corespunzator acesteia.

42

TEMA 2. METODA GREEDY


1

30

50

20

60
70
70

110

100

90

120

150

80
40

10

100

30

130

10

Figura 2.4.1:
Aplicarea Algoritmului Kruskal este evidentiata n urmatorul tabel:
Pas
1
2
3
4
5
6
7
8
9

Muchia selectata
[5, 8]
[3, 6]
[1, 2]
[8, 9]
[2, 3]
[2, 5]
[4, 6]
[7, 8]
[4, 10]

Costul ei
10
20
30
30
50
60
90
100
120

Arborele partial de cost minim obtinut este reprezentat n Figura 2.4.2. Costul acestui APM este de 510.
1

30

50

3
20

60

90

120

5
10

100

30

10

Figura 2.4.2:
Aplicarea Algoritmului Prim pentru acelasi graf este evidentiata n urmatorul tabel:

43

TEMA 2. METODA GREEDY


Pas
0
1
2
3
4
5
6
7
8
9

Muchia selectata
[1, 2]
[2, 3]
[3, 6]
[2, 5]
[5, 8]
[8, 9]
[6, 4]
[8, 7]
[4, 10]

Costul ei
30
50
20
60
10
30
90
100
120

Nodul selectat
1
2
3
6
5
8
9
4
7
10

Arborele partial de cost minim obtinut este deci acelasi cu cel obtinut
prin aplicarea Algoritmului Kruskal.
Observatia 2.4.2. Algoritmii Kruskal si Prim sunt specifici metodei de
programare Greedy. Algoritmul Kruskal selecteaza muchii, n ordinea
crescatoare a costurilor, subgrafurile induse pe parcurs de acestea nefiind
neaparat conexe. Algoritmul Prim selecteaza muchii si noduri, nu neaparat
n ordinea crescatoare a costurilor muchiilor, iar subgrafurile induse pe parcurs de muchiile selectate sunt conexe.
In implementari optime, se poate arata ca Algoritmul Kruskal are complexitatea O (m ln n) (fiind necesara sortarea muchiilor dupa cost), iar Algoritmul Prim are complexitatea O (n2 ) n cazul memorarii grafului prin matricea de adiacenta (o astfel de implementare va fi prezentata n continuare),
unde n si m reprezinta numerele de noduri, respectiv de muchii ale grafului
dat. Graful fiind conex, m n 1.
Pentru grafuri simple, m n(n1)
. Folosind si inegalitatea ln n n 1,
2
obtinem ca Algoritmul Kruskal este mai eficient pentru grafuri sarace n
muchii, iar Algoritmul Prim este mai eficient pentru grafuri bogate n
muchii.
Observatia 2.4.3. Pentru implementarea Algoritmului Kruskal, memoram
graful ponderat conex (G, c), unde G = (V, E), V = {1, . . . , n}, E =
{e1 , . . . , em }, ntr-o matrice cu 3 linii si m coloane P = (pik ) i = 1, 3 avand
k = 1, m

semnificatia:
daca ek = [xk , yk ] E, atunci p1k = xk , p2k = yk si p3k = c(ek ).
Utilizam un vector S cu semnificatia

1, daca ek a fost selectata,
S[k] =
0, n caz contrar,

TEMA 2. METODA GREEDY

44

k {1, . . . , m} si un vector CC cu semnificatia


CC[i] = numarul componentei conexe n care se afla nodul i n graful
indus de muchiile selectate, i {1, . . . , n}.
Astfel o muchie [x, y] nu formeaza cicluri cu muchiile selectate daca si numai
daca
CC[x] 6= CC[y].
Descrierea n pseudocod a algoritmului are urmatoarea forma.
KRUSKAL :
SORTARE(P );
// se sorteaz
a coloanele matricei P
// cresc
ator dup
a costurile muchiilor
for i = 1, m do S[i] 0;
for i = 1, n do CC[i] i;
cost 0;
// costul APM
poz 0;
// c
autarea urm
atoarei muchii ek ce va fi
// selectat
a ^
ncepe de pe pozit
ia poz + 1
for l = 1, n 1 do
// pasul l
k poz;
repeat
k k + 1; x p1k ; y p2k ; c p3k ;
while (CC[x] = CC[y]);
S[k] 1;
// select
am ek = [x, y]
cost cost + c; poz k;
aux CC[y]; // actualiz
am vectorul CC prin unificarea
// componentelor conexe ale lui x s
i y
for i = 1, n do
if (CC[i] = aux) then CC[i] CC[x];

Observatia 2.4.4. Pentru implementarea Algoritmului Prim, memoram graful


ponderat conex si simplu (G, c), unde G = (V, E), V = {1, . . . , n}, E =
{e1 , . . . , em }, cu ajutorul unei matrice C = (cij )i,j=1,n a costurilor (directe)
avand semnificatia

c([i, j]), daca [i, j] E,


0, daca i = j,
cij =
(2.4.2)

, n rest,

i, j {1, . . . , n}. Pentru grafuri neorientate, matricea C este simetrica. In


cazul grafurilor nesimple putem lua
cij = min{c(e)|e = [i, j] E}.

TEMA 2. METODA GREEDY

45

Utilizam un vector S cu semnificatia



1, daca nodul i a fost selectat,
S[i] =
0, n caz contrar
si doi vectori t si T AT A avand semnificatia
t[i] = costul minim al unei muchii [i, j] de la nodul i la un nod selectat j,
T AT A[i] = nodul j ce atinge minimul n t[i], i {1, . . . , n}.
Descrierea n pseudocod a algoritmului are urmatoarea forma.
PRIM :
S[1] 1;
// select
am nodul 1
cost 0;
// costul APM
// init
ializ
ari
for i = 2, n do
S[i] 0; t[i] ci1 ; T AT A[i] 1;
for l = 1, n 1 do
// c
aut
am nodul y
si muchia [x, y]
// ce vor fi selectate la pasul l
min ;
for i = 2, n do
if (S[i] = 0) and (t[i] < min) then
min t[i]; y i;
S[y] 1;
// select
am nodul y
x T AT A[y];
//
si muchia [x, y]
cost cost + cxy ;
for i = 2, n do
// actualiz
am vectorii t s
i T AT A
if (S[i] = 0) and (t[i] > ciy ) then
t[i] ciy ; T AT A[i] y;

2.5

Distante si drumuri minime. Algoritmul


lui Dijkstra

Problema determinarii distantelor si drumurilor minime ntre nodurile unui


graf ponderat apare n numeroase aplicatii practice. In continuare vom
prezenta un algoritm clasic pentru rezolvarea acestei probleme.
Definitia 2.5.1. Fie (G, c) un graf ponderat, unde G = (V, E), V = {v1 , . . . ,
vn } iar c : E R+ .

46

TEMA 2. METODA GREEDY

a) Daca = (x0 , e1 , x1 , . . . , xk1 , ek , xk ) este un drum al grafului G, unde


x0 , x1 , . . . , xk V , e1 , . . . , ek E, k N, atunci costul (ponderea)
lui este

0, daca k = 0,
k
P
c() =
c(ei ), daca k 1

i=1

(adica suma costurilor arcelor sau muchiilor sale).

b) Fie x, y V . Un drum = (x, . . . , y) n graful G cu proprietatea ca


c( ) = min{c()| este drum de la x la y n G}
se numeste drum minim (drum de cost minim, drum de pondere minim
a) de la x la y n graful ponderat (G, c). Costul c( )
al acestui drum minim se numeste distanta minim
a de la x la y n
graful (G, c).
Observatia 2.5.1. Eliminand eventualele circuite C1 , . . . , Cp dintr-un drum
de la nodul x la nodul y obtinem un drum elementar de la x la y cu
p
P
c(Ck ) c().
proprietatea ca c( ) = c()
k=1

Daca drumul este minim atunci si drumul elementar este minim si


c(e) = 0 pentru orice muchie sau arc e al circuitelor C1 , . . . , Cp . Deci existenta
unui drum minim de la x la y implica existenta unui drum minim elementar
de la x la y. Astfel distanta minima de la x la y poate fi considerata ca fiind
costul minim al unui drum elementar de la x la y. Mai mult, daca functia
cost c este strict pozitiva, atunci orice drum minim este elementar.
Observatia 2.5.2. Multimea drumurilor elementare fiind evident finita, avem
echivalenta: exista drumuri minime de la x la y daca si numai daca exista
drumuri de la x la y.
Observatia 2.5.3. Distanta minima de la un nod x la el nsusi este egala cu
zero, drumul minim elementar de la x la x fiind drumul de lungime zero,
= (x).
Observatia 2.5.4. Daca = (x0 , x1 , . . . , xk ) este un drum minim de la x0 la
xk , atunci orice subdrum = (xi , xi+1 , . . . , xj ) (0 i j k) al sau este
un drum minim de la xi la xj (principiul optimalit
atii al lui Bellman).
Afirmatia poate fi justificata usor prin reducere la absurd.
Exemplul 2.5.1. Fie graful ponderat (G, c) reprezentat n Figura 2.5.1.

47

TEMA 2. METODA GREEDY

1
5

10

5
3

5
15

10

2
Figura 2.5.1:
Drumurile elementare de la nodul 1 la nodul 5 sunt 1 = (1, 3, 5), avand
costul c(1 ) = 10 + 5 = 15, 2 = (1, 4, 5), avand costul c(2 ) = 5 + 5 = 10,
deci 2 este un drum minim de la 1 la 5. Astfel distanta minima de la nodul
1 la nodul 5 este c(2 ) = 10.
Definitia 2.5.2. Fie (G, c) un graf ponderat, unde G = (V, E), V = {v1 , . . . ,
vn }, c : E R+ .
a) Matricea distantelor (costurilor) directe asociata grafului (G, c)
este matricea C = (cij )i,j=1,n definita prin

0, daca i = j,
min{c(e)|e = (vi , vj ) E}, daca i 6= j si (vi , vj ) E,
cij =

, daca i 6= j si 6 (vi , vj ) E
(pentru grafuri neorientate (vi , vj ) desemnand de fapt muchia [vi , vj ]).

b) Matricea distantelor (costurilor) minime asociata grafului (G, c)


este matricea C = (cij )i,j=1,n definita prin

c( ), = drum minim de la vi la vj ,

daca = (vi , . . . , vj ) drum n G,


cij =

, n caz contrar.

Observatia 2.5.5. Evident, pentru orice graf neorientat atat matricea distantelor directe cat si matricea distantelor minime sunt matrice simetrice.

48

TEMA 2. METODA GREEDY

Observatia 2.5.6. Conform Observatiei 2.5.1, putem sa nlocuim termenul de


drum cu cel de drum elementar n definitia anterioara.
Conform Observatiei 2.5.2, punctul b) din definitia anterioara este o extindere a definitiei distantei minime de la punctul b) al Definitiei 2.5.1.
Conform Observatiei 2.5.3, cii = 0 i {1, . . . , n}.
Exemplul 2.5.2. Matricele distantelor directe, respectiv minime asociate grafului din Exemplul 2.5.1 sunt

0 15 10 5 10
0 15 10 5
0
0

, C = 10 5 0 15 5 .

5
0

5
C=

10 10 20 0 5
10 0 5
5 5 15 10 0
5 5 0

Vom expune n continuare un algoritm pentru determinarea distantelor


minime si a drumurilor minime de la un nod fixat, numit si nod sursa, la
toate nodurile grafului ponderat dat.
Algoritmul 2.5.1 (Dijkstra). Fie (G, c) un graf ponderat, G = (V, E), V =
{v1 , v2 , . . . , vn }, c : E R+ . Fie C = (cij )i,j=1,n matricea distantelor directe asociata grafului (G, c) si fie vs V un nod arbitrar fixat, numit nod
surs
a. Distantele minime de la nodul vs la nodurile grafului sunt calculate
si memorate ntr-un vector t = (t1 , . . . , tn ) astfel:
La pasul 1 se selecteaza nodul sursa vs si se ia ts = 0;
La pasul k, 2 k n, se cunosc nodurile vi1 , . . . , vik1 selectate la
pasii anteriori si distantele corespondente ti1 , . . . , tik1 .
a) Daca nu mai exista nici-o muchie sau arc de la un nod selectat
vj {vi1 , . . . , vik1 } la un nod neselectat vi V \{vi1 , . . . , vik1 }, atunci
se ia ti = pentru orice nod neselectat vi V \ {vi1 , . . . , vik1 } si
algoritmul se ncheie.
b) In caz contrar se selecteaza un nod vik V \ {vi1 , . . . , vik1 } cu
proprietatea ca exista un nod selectat vjk {vi1 , . . . , vik1 } astfel ncat

tjk + cjk ik = min{tj + cji |vj {vi1 , . . . , vik1 }, vi V \ {vi1 , . . . , vik1 }}.
(2.5.1)
Se ia
tik = tjk + cjk ik
si se trece la pasul k + 1.

(2.5.2)

49

TEMA 2. METODA GREEDY


Observatia 2.5.7. Evident, algoritmul executa cel mult n pasi.

Teorema 2.5.1 (de corectitudine a Algoritmului Dijkstra). In contextul Algoritmului Dijkstra, avem
ti = csi , i {1, . . . , n}
(adica distanta ti calculata de algoritm este chiar distanta minima de la vs
la vi ).
Demonstratie. Vom demonstra prin inductie dupa k ca nodul vik selectat la
pasul k si distanta corespondenta tik calculata la acel pas verifica egalitatea
din enunt, adica
tik = csik ,
si, n plus, tik < .
Pentru k = 1 afirmatia este evidenta deoarece
vi1 = vs , ti1 = 0 = css .
Presupunem adevarata afirmatia pentru orice pas mai mic decat k si o
demonstram pentru pasul k. Fie vjk {vi1 , . . . , vik1 } un nod ce verifica egalitatea (2.5.1). Din descrierea algoritmului si din ipoteza de inductie (nodul
vjk fiind selectat la un pas anterior), rezulta ca tjk = csjk < si cjk ik < ,
deci tik < (conform (2.5.2)).
Daca (vs , . . . , vjk ) este un drum minim de la vs la vjk (exista, deoarece

csjk < ), atunci = (vs , . . . , vjk , vik ) este un drum de la vs la vik , avand
costul c() = csjk + cjk ik = tjk + cjk ik = tik (conform (2.5.2)), deci
csik tik < .

(2.5.3)

Rezulta ca exista drumuri minime de la vs la vik . Fie


= (vs = x0 , x1 , . . . , xp1 , xp = vik )
un drum elementar minim de la vs la vik . Fie l {0, 1, . . . , p 1} indicele
maxim astfel ncat xl {vi1 , . . . , vik1 } (exista, deoarece x0 = vs = vi1 ).
Fie xl = vir , 1 r k 1, si fie xl+1 = viq , q k.
Din descrierea pasului q al algoritmului, conform relatiilor (2.5.1) si (2.5.2)
rezulta ca
tiq tir + cir iq ,

50

TEMA 2. METODA GREEDY


iar conform ipotezei de inductie pentru r avem
tir = csir < .
Deci
tiq csir + cir iq = csiq

(2.5.4)

(conform principiului optimalitatii al lui Bellman pentru subdrumurile dintre


x0 = vs si xl = vir , respectiv dintre x0 = vs si xl+1 = viq ale drumului minim
).
Cazul 1) Daca l = p 1. atunci xl+1 = vik , deci q = k si din (2.5.3) si
(2.5.4) rezulta ca tik = csik < .
Cazul 2) Daca l < p 1, deci q 6= k, demonstram ca
tik = csik
prin reducere la absurd. Intr-adevar, n caz contrar conform (2.5.3) am avea
csik < tik .
Cum q > k, din descrierea algoritmului avem tiq tik (deoarece valorile
tik sunt monoton crescatoare de la un pas la altul, inductie!). Utilizand
(2.5.4) am obtine
csik < tik tiq csiq ,
ceea ce contrazice faptul ca are loc inegalitatea csiq csik (conform principiului optimalitatii al lui Bellman pentru subdrumul dintre vs si viq al drumului
minim ).
Demonstratia prin inductie este ncheiata.
Evident, pentru orice nod vi ramas neselectat n urma executarii ultimului
pas al algoritmului avem ti = = csi .
Intr-adevar, daca ar exista un drum elementar minim
= (vs = y0 , y1 , . . . , yp = vi ),
luand l {0, 1, . . . , p 1} indicele maxim pentru care yl este selectat (exista,
deoarece y0 = vs este selectat) atunci yl+1 ar fi neselectat desi exista o muchie
sau un arc de la yl la yl+1 , contradictie cu descrierea modului de ncheiere a
algoritmului.
Exemplul 2.5.3. Pentru graful ponderat din Exemplul 2.5.1, luand ca nod
sursa nodul 1, aplicarea Algoritmului Dijkstra este evidentiata n urmatorul
tabel:

51

TEMA 2. METODA GREEDY


Pas Nodul selectat
1
1
2
4
3
3
4
5
5
2

Distanta minima
0
5
10
10
15

De exemplu, la pasul 3 avem deja selectate nodurile i1 = 1 si i2 = 4, cu


distantele minime t1 = c11 = 0 si t4 = c14 = 5. Se selecteaza nodul i3 = 3,
cu distanta minima t3 = 10, deoarece
min{t1 + c12 , t1 + c13 , t1 + c15 , t4 + c42 , t4 + c43 , t4 + c45 }
= min{0 + 15, 0 + 10, 0 + , 5 + 10, 5 + , 5 + 5} = 10 = t1 + c13 .
Observatia 2.5.8. Algoritmul Dijkstra este specific metodei de programare
Greedy, el selectand nodurile n ordinea crescatoare a distantei fata de nodul
sursa.
Observatia 2.5.9. Pentru implementarea Algoritmului Dijkstra, consideram
ca V = {1, . . . , n} si ca nodul sursa este s V . Utilizam un vector S avand
semnificatia

1, daca nodul i a fost selectat,
i {1, . . . , n}
S[i] =
0, n caz contrar,
si un vector t avand semnificatia
t[i] = distanta minima de la nodul sursa s la nodul i, i {1, . . . , n},
calculat conform (2.5.1) si (2.5.2).
Pentru determinarea drumurilor minime de la nodul s la nodurile grafului
vom utiliza si un vector T AT A avand semnificatia
T AT A[i] = nodul j ce este predecesorul direct al nodului i pe drumul
minim de la s la i, i {1, . . . , n}.
Daca i = ik este nodul selectat la pasul k, atunci j = jk se determina
conform egalitatii (2.5.1).
Descrierea n pseudocod a algoritmului are forma urmatoare.

TEMA 2. METODA GREEDY

52

DIJKSTRA(s) :
for i = 1, n do
// init
ializ
ari
S[i] 0; t[i] ; T AT A[i] ;
t[s] 0; T AT A[s] 0;
// s este nodul surs
a
repeat
// select
am urm
atorul nod x, ^
n ordinea cresc
atoare
// a distant
elor minime de la s la x
min ;
for i = 1, n do
if (S[i] = 0) and (t[i] < min) then
min t[i];
x i;
if (min < ) then
// exist
a x,
^l select
am
S[x] 1;
for i = 1, n do
// actualiz
am vectorii t s
i T AT A
if (S[i] = 0) and (cxi < ) then
if (t[i] > t[x] + cxi ) then
t[i] t[x] + cxi ;
T AT A[i] x;
while (min < );

Observatia 2.5.10. Implementarea anterioara necesita O (n2 ) operatii (deoarece blocul repeat se executa de cel mult n ori si necesita de fiecare data
cel mult n comparatii pentru determinarea nodului selectat x si cel mult n
comparatii si n adunari pentru actualizarea vectorilor t si T AT A). Aceasta
este de fapt si complexitatea Algoritmului Dijkstra (n implementarea optima) n cazul memorarii grafului prin matricea distantelor directe.

2.6

Fluxuri maxime n retele

Definitia 2.6.1. O retea (retea de transport) are forma R = (G, s, t, c),


unde:
G = (V, E) este un graf orientat simplu.

V se numeste si multimea nodurilor retelei, iar E se numeste si


multimea arcelor retelei;

s, t V sunt doua noduri a.. s 6= t.

Nodul s se numeste nodul surs


a (intrarea) al retelei, iar nodul t se
numeste nodul destinatie (ie
sirea) al retelei;

TEMA 2. METODA GREEDY

53

c : E R+ este o functie numita functie capacitate.

Pentru orice e E, c(e) se numeste capacitatea arcului e.

Pentru simplificarea notatiilor, extindem functia capacitate


(
c(i, j), daca (i, j) E,
c : V V R+ , c(i, j) =
0,
daca (i, j) 6 E.

(2.6.1)

Exemplul 2.6.1. In Figura 2.6.1 este reprezentata o retea R, capacitatile fiind


mentionate pe arce. Consideram ca aceasta retea are intrarea s = 1 si iesirea
t = 6.

Figura 2.6.1:
Definitia 2.6.2. Fie R = (G, s, t, c) o retea, unde G = (V, E). Un flux
n reteaua R este o functie f : V V R ce verifica urmatoarele doua
proprietati:
X
jV

0 f (i, j) c(i, j), i, j V,


X
f (j, i) =
f (i, j), i V \ {s, t}.

(2.6.2)
(2.6.3)

jV

f (i, j) reprezinta fluxul transportat pe arcul (i, j).


Relatia (2.6.2) se numeste conditia de m
arginire a fluxului, iar
relatia (2.6.3) se numeste conditia de conservare a fluxului.
Observatia 2.6.1. Evident,
f (i, j) = 0 (i, j) 6 E,
deci, analog functiei capacitate c, si functia flux f poate fi definita (restransa)
doar pe multimea arcelor retelei (adica f : E R).

54

TEMA 2. METODA GREEDY

Observatia 2.6.2. Definitiile si rezultatele din aceasta sectiune sunt valabile


si pentru retele formate cu grafuri orientate oarecare (nu neaparat simple).
In acest caz general functiile capacitate si flux se definesc neaparat doar pe
colectia (multisetul) E a arcelor retelei.
Observatia 2.6.3. In particular, f (i, j) = 0 i, j V este un flux n orice
retea, numit fluxul nul.
Exemplul 2.6.2. Pentru reteaua din Figura 2.6.1, un exemplu de flux este
reprezentat n Figura 2.6.2. Pe fiecare arc (i, j) sunt mentionate fluxul f (i, j)
si capacitatea c(i, j), n aceasta ordine.

Figura 2.6.2:
Lema 2.6.1. Fie R = (G, s, t, c) o retea, unde G = (V, E). Pentru orice flux
f n reteaua R are loc egalitatea
!
X
X
X
X
f (i, t)
f (t, i) =
f (i, s)
f (s, i) .
iV

iV

iV

iV

Definitia 2.6.3. Fie R = (G, s, t, c) o retea, unde G = (V, E). Pentru orice
flux f n reteaua R, numarul
!
X
X
X
X
v(f ) =
f (i, t)
f (t, i) =
f (i, s)
f (s, i)
iV

iV

iV

iV

se numeste valoarea fluxului f (fluxul net ce ajunge la nodul destinatie,


fluxul net ce iese din nodul sursa).
Exemplul 2.6.3. Fluxul din Figura 2.6.2 are valoarea v(f ) = 2 + 6 = 8.

TEMA 2. METODA GREEDY

55

Definitia 2.6.4. Fie R = (G, s, t, c) o retea. Un flux f n reteaua R cu


proprietatea ca
v(f ) = max{v(f ) | f = flux n R}
se numeste flux de valoare maxim
a (flux maxim) n reteaua R.
Problema determinarii fluxurilor maxime ntr-o retea are numeroase aplicatii practice. In continuare vom prezenta doi algoritmi clasici pentru
rezolvarea acestei probleme.
Incepem cu definirea unor notiuni ajutatoare.
Definitia 2.6.5. Daca = [x0 , x1 , . . . , xk ] este un lant elementar n graful orientat G = (V, E), atunci arcele sale de forma (xi , xi+1 ) E (i
{0, . . . , k 1}) se numesc arce directe pentru lantul , iar arcele sale de
forma (xi+1 , xi ) E (i {0, . . . , k 1}) se numesc arce inverse pentru
lantul .
Exemplul 2.6.4. Pentru graful din Figura 2.6.2, lantul [1, 2, 3, 4, 5, 6] are arcele
directe (1, 2), (2, 3), (4, 5), (5, 6) si arcul invers (4, 3).
Definitia 2.6.6. Fie f un flux n reteaua R = (G, s, t, c). Un C-lant n
reteaua R relativ la fluxul f este un lant elementar n graful G ce verific
a
urmatoarele doua proprietati:
f (i, j) < c(i, j), (i, j) = arc direct al lui ,
f (i, j) > 0, (i, j) = arc invers al lui .
Definitia 2.6.7. Fie f un flux n reteaua R = (G, s, t, c) si fie un C-lant
n reteaua R relativ la fluxul f .
a) Pentru orice arc (i, j) al lui , numarul
(
c(i, j) f (i, j), daca (i, j) este arc direct al lui ,
r (i, j) =
f (i, j), daca (i, j) este arc invers al lui
se numeste capacitatea rezidual
a (reziduul) a arcului (i, j) relativ
la C-lantul .
b) Numarul
r() = min{r (i, j) | (i, j) = arc al lui }

se numeste capacitatea rezidual


a (reziduul) a C-lantului .
Observatia 2.6.4. Conform definitiilor anterioare, pentru orice C-lant avem
r() > 0.

TEMA 2. METODA GREEDY

56

Exemplul 2.6.5. Pentru reteaua si fluxul reprezentate n Figura 2.6.2, lantul


= [1, 2, 3, 4, 5, 6] este un C-lant. Reziduurile pe arcele acestui C-lant sunt
r (1, 2) = 3 2 = 1, r (2, 3) = 4 1 = 3, r (4, 3) = 5,
r (4, 5) = 3 2 = 1, r (5, 6) = 7 2 = 5,
deci reziduul pe acest C-lant este r() = 1.
Definitia 2.6.8. Fie f un flux n reteaua R = (G, s, t, c). Un C-lant de la s
la t n reteaua R relativ la fluxul f se numeste lant de cre
stere (n reteaua
R relativ la fluxul f ).
Exemplul 2.6.6. Lantul = [1, 2, 3, 4, 5, 6] din exemplul anterior este un lant
de crestere.
Lema 2.6.2. Fie R = (G, s, t, c) o retea, unde G = (V, E). Fie f un flux n
reteaua R si fie un lant de crestere n reteaua R relativ la fluxul f . Atunci
functia f : V V R definita prin

f (i, j) + r(), daca (i, j) este arc direct al lui ,

f (i, j) = f (i, j) r(), daca (i, j) este arc invers al lui ,

f (i, j), daca (i, j) nu este arc al lui


este un flux n reteaua R si

v(f ) = v(f ) + r().


Observatia 2.6.5. In contextul lemei anterioare, conform Observatiei 2.6.4
avem
v(f ) = v(f ) + r() > v(f ).
Inegalitatea justifica denumirea lui drept lant de crestere a fluxului f , iar
egalitatea justifica denumirea lui r() drept capacitatea reziduala a lantului
.
Definitia 2.6.9. Fluxul f definit n lema anterioara se numeste fluxul
obtinut prin m
arirea fluxului f de-a lungul lantului de cre
stere
si se noteaza cu
f = f r().
Exemplul 2.6.7. Pentru reteaua R si fluxul f reprezentate n Figura 2.6.2,
lantul = [1, 2, 3, 4, 5, 6] este un lant de crestere avand reziduul r() = 1.
Fluxul f = f r() obtinut prin aplicarea lemei anterioare este reprezentat
n Figura 2.6.3. Valoarea acestui flux este v(f ) = v(f ) + r() = 8 + 1 = 9.

57

TEMA 2. METODA GREEDY

Figura 2.6.3:
Definitia 2.6.10. Fie R = (G, s, t, c) o retea, unde G = (V, E). O sectiune
(t
aietur
a) n reteaua R este o pereche (S, T ) V V ce verific
a urmatoarele
proprietati:
S T = V, S T = ,
s S, t T.
Observatia 2.6.6. Daca (S, T ) este o sectiune n reteaua R = (G, s, t, c), unde
G = (V, E), atunci V = S T este o partitie a multimii V a nodurilor retelei
(adica V = S T , S 6= , T 6= , S T = ) a.. s S si t T . Rezulta
ca numarul de sectiuni ale retelei R este egal cu numarul de submultimi
S \ {s} V \ {s, t}, deci cu
2n2, unde n = card (V ).
Definitia 2.6.11. Fie R = (G, s, t, c) o retea, unde G = (V, E). Pentru
orice sectiune (S, T ) n reteaua R, numarul
XX
c(S, T ) =
c(i, j)
iS jT

se numeste capacitatea sectiunii (S, T ).


Observatia 2.6.7. Conform relatiei (2.6.1), capacitatea unei sectiuni (S, T )
este suma capacitatilor tuturor arcelor ce au extremitatea initiala n S si
extremitatea finala n T .
Exemplul 2.6.8. Pentru reteaua reprezentata n Figura 2.6.1,
(S, T ) = ({1, 2, 5}, {3, 4, 6})

58

TEMA 2. METODA GREEDY


este o sectiune avand capacitatea
c(S, T ) = c(1, 4) + c(2, 3) + c(2, 4) + c(5, 6) = 10 + 4 + 2 + 7 = 23.

Lema 2.6.3. Fie R = (G, s, t, c) o retea. Pentru orice flux f si orice sectiune
(S, T ) n reteaua R avem
v(f ) =

XX
iS jT

(f (i, j) f (j, i))

(adica valoarea fluxului este egala cu fluxul net ce traverseaza sectiunea).


Lema 2.6.4. Fie R = (G, s, t, c) o retea.
a) Pentru orice flux f si orice sectiune (S, T ) n reteaua R avem
v(f ) c(S, T ).
b) Daca f este un flux si (S , T ) este o sectiune n reteaua R astfel ncat
v(f ) = c(S , T ),
atunci f este un flux de valoare maxima si (S , T ) este o sectiune de
capacitate minima n reteaua R.
Teorema 2.6.1 (de caracterizare a unui flux de valoare maxim
a).
Fie R = (G, s, t, c) o retea. Un flux f n reteaua R este un flux de valoare
maxima daca si numai daca nu exista lanturi de crestere n reteaua R relativ
la fluxul f .
Demonstratie. Fie f un flux de valoare maxima n R. Daca ar exista
un lant de crestere n R relativ la fluxul f , atunci conform Lemei 2.6.2 ar
rezulta ca functia f = f r() ar fi un flux n R si v(f ) = v(f )+r() > v(f )
(conform Observatiei 2.6.5) contradictie. Deci nu exista lanturi de crestere
n R relativ la fluxul f .
Fie f un flux n R a.. nu exista lanturi de crestere n R relativ la
f . Fie
(
S = {i V | exista C-lanturi de la s la i n R relativ la f },
T = {i V | nu exista C-lanturi de la s la i n R relativ la f }.
(2.6.4)
Evident, S T = V si S T = .

59

TEMA 2. METODA GREEDY

De asemenea, avem s S (deoarece [s] este un C-lant de la s la s n R


relativ la f ) si t T (deoarece nu exista lanturi de crestere, adica C-lanturi
de la s la t n R relativ la f ). Deci (S, T ) este o sectiune n reteaua R.
Fie i S si j T arbitrar fixati. Deoarece i S rezulta ca exista un Clant = [s = x0 , x1 , . . . , xk = i] n R relativ la f . Atunci x0 , x1 , . . . , xk S
(sublanturile C-lantului sunt tot C-lanturi), deci j 6 V ().
Daca am avea f (i, j) < c(i, j) sau f (j, i) = 0, atunci ar rezulta ca [s =
x0 , x1 , . . . , xk = i, j] ar fi un C-lant n R relativ la f , ceea ce ar contrazice
apartenenta j T . Deci
f (i, j) = c(i, j) si f (j, i) = 0,
pentru orice i S si j T .
Aplicand Lema 2.6.3, avem
v(f ) =

XX
iS jT

(f (i, j) f (j, i)) =

XX
iS jT

(c(i, j) 0) = c(S, T ),

deci conform Lemei 2.6.4 rezulta ca f este un flux de valoare maxima n


reteaua R (iar (S, T ) este o sectiune de capacitate minima n reteaua R).
Observatia 2.6.8. Daca se cunoaste un flux f de valoare maxima ntr-o retea
R, atunci formulele (2.6.4) determina o sectiune (S, T ) de capacitate minima,
deci orice algoritm pentru determinarea unui flux de valoare maxima bazat
pe caracterizarea data n teorema anterioara rezolva si problema determinarii
unei sectiuni de capacitate minima.
Definitia 2.6.12. Fie f un flux n reteaua R = (G, s, t, c), unde G = (V, E).
Functia r : V V R+ definita prin

c(i, j) f (i, j), daca f (i, j) < c(i, j),


r(i, j) = f (j, i), daca f (j, i) > 0 si f (i, j) = c(i, j),

0, n rest

se numeste capacitatea rezidual


a (reziduul) a retelei R relativ la fluxul
f , iar graful orientat Gf = (V, Ef ) definit prin
Ef = {(i, j) V V | r(i, j) > 0}
se numeste graful rezidual al retelei R relativ la fluxul f .
Observatia 2.6.9. Fie f un flux n reteaua R = (G, s, t, c). Fie r si Gf
capacitatea reziduala, respectiv graful rezidual ale retelei R relativ la fluxul

TEMA 2. METODA GREEDY

60

f . Fie = [x0 , x1 , . . . , xk ] un lant elementar n graful G. Evident, avem


echivalentele:
este un C-lant n R relativ la f r(xi , xi+1 ) > 0, i {0, . . . , k 1}
(x0 , x1 , . . . , xk ) este un drum elementar n graful rezidual Gf ;
este un lant de crestere n R relativ la f
(x0 , x1 , . . . , xk ) este un drum elementar de la s la t n graful rezidual Gf .
Exemplul 2.6.9. Pentru reteaua R si fluxul f reprezentate n Figura 2.6.3,
graful rezidual Gf este reprezentat n Figura 2.6.4, capacitatile reziduale
fiind mentionate pe arce.
(1, 4, 2, 3, 6) este un drum elementar n graful rezidual Gf , deci =
[1, 4, 2, 3, 6] este un lant de crestere n reteaua R relativ la fluxul f .

Figura 2.6.4:
Conform rezultatelor de mai sus obtinem urmatorul algoritm pentru determinarea unui flux de valoare maxima ntr-o retea.
Algoritmul 2.6.1 (Ford-Fulkerson). Fie R = (G, s, t, c) o retea, unde G =
(V, E).
Conform Teoremei 2.6.1, schita algoritmului, descrisa n pseudocod, are
urmatoarea forma.

TEMA 2. METODA GREEDY

61

FORD FULKERSON :
f 0;
// sau f f0 , unde f0 este un flux
// disponibil init
ial
repeat
LANT
if (EXISTA
DE CRES
TERE) then
// exist
a lant
uri de cre
stere
// relativ la fluxul curent f
LANT
DE CRES
TERE;
// se determin
a
// un astfel de lant
de cre
stere
f f r(); // se m
are
ste valoarea fluxului curent,
// de-a lungul lant
ului de cre
stere
LANT
while (EXISTA
DE CRES
TERE);
// nu mai exist
a lant
uri de cre
stere,
// deci fluxul curent este de valoare maxim
a
AFIS
ARE(f );
// se afi
seaz
a fluxul de valoare maxim
a
In continuare detaliem implementarea acestui algoritm. Presupunem ca
V = {1, 2, . . . , n}, s = 1, t = n,
cu n 2.
Pentru depistarea si memorarea eventualelor lanturi de crestere relativ la
fluxul curent vom utiliza doi vectori SEL si T AT A avand semnificatia

1, daca exista un C-lant de la nodul s = 1 la nodul i,
SEL[i] =
0, n caz contrar,
T AT A[i] =predecesorul direct al nodului i pe C-lantul
de la nodul s = 1 la nodul i,
i {1, . . . , n}.
Algoritmul descris n pseudocod are urmatoarea forma (detaliata).

62

TEMA 2. METODA GREEDY


FORD FULKERSON :
CITIRE RET
EA;
for i = 1, n do
for j = 1, n do fij 0;

// se cite
ste ret
eaua dat
a
// fluxul init
ial

vmax 0;
// valoarea fluxul maxim
repeat // se caut
a lant
uri de cre
stere a fluxului curent,
// folosind Observat
ia 2.6.9
CALCUL REZIDUURI;
// se determin
a reziduul s
i
// graful rezidual ale ret
elei relativ la fluxul curent
SEL[1] 1;
// se selecteaz
a nodul surs
a
for i = 2, n do SEL[i] 0;
T AT A[1] 0;
// pt. memorarea C-lant
urilor
// ce pornesc din nodul surs
a
DF(1);
// se parcurge graful rezidual, memor^
and
// C-lant
urile ce pornesc din nodul surs
a;
// parcurgerea DF, poate fi
^nlocuit
a cu
// parcurgerea BF (Algoritmul Edmonds-Karp )
if (SEL[n] = 1) then
// s-a selectat nodul destinat
ie,
// deci exist
a lant
de cre
stere a fluxului
rmin ;
// reziduul minim, de-a lungul
// lant
ului de cre
stere
a lant
ul de cre
stere
DET LANT CR; // se determin
// a fluxului
si reziduul minim

// se m
are
ste fluxul curent, de-a
MARIRE FLUX;
// lungul lant
ului de cre
stere
vmax vmax + rmin;;
// se actualizeaz
a valoarea
// fluxului curent
while (SEL[n] = 1);
// nu mai exist
a lant
uri de cre
stere a fluxului,
// deci fluxul curent este maxim
AFIS
ARE REZULTATE;
// se afi
seaz
a fluxul maxim
si valoarea sa,
// eventual
si sect
iunea de capacitate minim
a,
// calculat
a conform (2.6.4) astfel:
// S = {i {1, . . . , n} | SEL[i] = 1},
// T = {i {1, . . . , n} | SEL[i] = 0}
Functiile utilizate sunt descrise n continuare.

TEMA 2. METODA GREEDY

63

CALCUL REZIDUURI :
for i = 1, n do
for j = 1, n do
if (fij < cij ) then
rij cij fij ;
else
if (fji > 0) then
rij fji ;
else
rij 0;
DF(i) :
for j = 1, n do
if (rij > 0 and SEL[j] = 0) then
T AT A[j] i; SEL[j] 1;;
DF(j);

// recursiv

DET LANT CR :
// se determin
a reziduul minim de-a
// lungul lant
ului de cre
stere, parcurs de la n c
atre 1
j n;
while (j 6= 1) do
i T AT A[j];
if (rmin > rij ) then rmin rij ;
j i;

MARIRE
FLUX :
// se m
are
ste fluxul de-a lungul
// lant
ului de cre
stere, parcurs de la n c
atre 1
j n;
while (j 6= 1) do
i T AT A[j];
if (cij > fij ) then
fij fij + rmin;
else
fji fji rmin;
j i;
Teorema 2.6.2 (de corectitudine a Algoritmului Ford-Fulkerson).
In contextul Algoritmului 2.6.1, fie R = (G, s, t, c) reteaua data, unde G =
(V, E). Presupunem ca toate capacitatile arcelor retelei sunt numere ntregi,
adica
c(i, j) N, (i, j) E.

TEMA 2. METODA GREEDY

64

Fie f0 fluxul initial. Presupunem ca toate componentele fluxului f0 sunt


numere ntregi, adica
f0 (i, j) N, (i, j) E,
de exemplu f0 = fluxul nul.
Fie 1 , 2 , . . . , k lanturile de crestere succesive obtinute, k 0, si fie
f1 = f0 r0 (1 ), f2 = f1 r1 (2 ), . . . , fk = fk1 rk1 (k ) fluxurile succesive
obtinute, unde 1 este lant de crestere relativ la f0 , 2 este lant de crestere
relativ la f1 , . . . , k este lant de crestere relativ la fk1 , si nu mai exista
lanturi de crestere relativ la fk . Atunci fk este un flux de valoare maxima n
reteaua R.
Mai mult, toate componentele fluxului fk si valoarea acestuia sunt numere
ntregi.
Demonstratie. Conform Lemei 2.6.2, f1 , f2 , . . . , fk sunt fluxuri si v(f1 ) =
v(f0 ) + r0 (1 ), v(f2 ) = v(f1 ) + r1 (2 ) = v(f0 ) + r0 (1 ) + r1 (2 ), . . . , v(fk ) =
v(fk1 ) + rk1 (k ) = v(f0 ) + r0 (1 ) + r1 (2 ) + + rk1 (k ).
Deoarece toate capacitatie c(i, j), i, j V , si toate componentele f0 (i, j),
i, j V ale fluxului initial sunt numere ntregi, conform Definitiei 2.6.7 si
Lemei 2.6.2 rezulta succesiv ca
(r0 )1 (i, j) N , (i, j) E(1 ), r0 (1 ) N ,
f1 (i, j) N, i, j V, v(f1 ) N ;
(r1 )2 (i, j) N , (i, j) E(2 ), r1 (2 ) N ,
f2 (i, j) N, i, j V, v(f2 ) N ; . . . ,
(rk1 )k (i, j) N , (i, j) E(k ), rk1(k ) N ,
fk (i, j) N, i, j V, v(fk ) N .
Deci
v(fk ) = v(f0 ) + r0 (1 ) + r1 (2 ) + + rk1 (k ) v(f0 ) + k.
Evident, ({s}, V \ {s}) este o sectiune n R avand capacitatea
X
c({s}, V \ {s}) =
c(s, j) (card (V ) 1)cmax ,
jV \{s}

unde
cmax = max{c(i, j) | (i, j) E}

(capacitatea maxima a arcelor retelei). Conform Lemei 2.6.4 avem


v(fk ) c({s}, V \ {s}),

(2.6.5)

TEMA 2. METODA GREEDY

65

si astfel obtinem
k (card (V ) 1)cmax v(f0 ),
deci numarul k de pasi ai algoritmului (numarul de lanturi de crestere succesive construite) este finit, adica exista k N astfel ncat reteaua R nu
mai contine lanturi de crestere relativ la fluxul fk . Conform Teoremei 2.6.1
rezulta ca fk este un flux de valoare maxima n R. Conform (2.6.5), toate
componentele fluxului fk si valoarea acestuia sunt numere ntregi.
Exemplul 2.6.10. Pentru reteaua R din Figura 2.6.1, aplicarea Algoritmului
Ford-Fulkerson este evidentiata n Figurile 2.6.5-2.6.10.

Figura 2.6.5:

Figura 2.6.6:

TEMA 2. METODA GREEDY

Figura 2.6.7:

Figura 2.6.8:

Figura 2.6.9:

66

TEMA 2. METODA GREEDY

67

Figura 2.6.10:
Lanturile succesive de crestere relativ la fluxul curent sunt evidentiate
prin ngrosare, si anume:
1
2
3
4
4

= [1, 2, 3, 5, 6],
= [1, 2, 3, 6],
= [1, 4, 3, 6],
= [1, 4, 5, 3, 6],
= [1, 4, 5, 6].

Fluxul reprezentat n Figura 2.6.10 este de valoare maxima, deoarece nu mai


exista lanturi de crestere n R relativ la acest flux. Valoarea acestui flux este
11.
Pentru acest flux maxim, avem C-lanturi de la nodul sursa s = 1 doar
la nodurile 1 si 4, aceste C-lanturi sunt evidentiate prin ngrosare n Figura
2.6.10. Conform (2.6.4) rezulta ca
(S, T ) = ({1, 4}, {2, 3, 5, 6})
este o sectiune de capacitate minima n R.
Observatia 2.6.10. Algoritmul Ford-Fulkerson este specific metodei de programare Greedy. Pentru o retea cu n noduri si m arce avand toate capacitatile numere ntregi si pentru un flux initial avand toate componentele
numere ntregi, de exemplu fluxul nul, conform demonstratiei Teoremei 2.6.2
rezulta ca numarul de lanturi de crestere necesare maririi succesive a fluxului initial, pana se ajunge la un flux de valoare maxima, este de cel mult
(n 1)cmax , unde cmax este capacitatea maxima a arcelor retelei. Pentru
fiecare flux curent, algoritmul necesita calculul reziduurilor celor m arce,
parcurgerea acestora pentru depistarea unui eventual lant de crestere, determinarea acestui lant (de lungime cel mult m) si marirea fluxului curent de-a

68

TEMA 2. METODA GREEDY

lungul lantului de crestere, operatii avand complexitatea O (m). Rezulta ca


Algoritmul Ford-Fulkerson are complexitatea O (mncmax ).
Observatia 2.6.11. Pentru o retea avand toate capacitatile numere rationale,
putem aplica Algoritmul Ford-Fulkerson astfel:
se nmultesc toate capacitatile arcelor cu numitorul lor comun M,
obtinandu-se o retea avand toate capacitatile numere ntregi;
se determina un flux de valoare maxima n aceasta retea, aplicand Algoritmul Ford-Fulkerson (pentru un flux initial avand toate componentele
numere ntregi, de exemplu fluxul nul);
se mpart toate componentele acestui flux prin M, obtinandu-se un flux
de valoare maxima n reteaua initiala.
Evident, toate componentele acestui flux maxim si valoarea lui sunt numere
rationale.
Teorema 2.6.3 (Ford-Fulkerson). Fie R = (G, s, t, c) o retea. Are loc
egalitatea
max{v(f ) | f = flux n R} = min{c(S, T ) | (S, T ) = sectiune n R}
(adica n orice retea valoarea maxima a unui flux este egala cu capacitatea
minima a unei sectiuni).
Demonstratie. Fie G = (V, E) si V = {v1 , . . . , vn }, cu v1 = s si vn = t.
(f )
Pentru orice flux f n R, notam cu X (f ) = (Xij )i,j=1,n Rnn matricea
definita prin
(f )
Xij = f (vi , vj ), i, j {1, . . . , n}.
Conform Definitiei 2.6.2 avem
(f )

0 Xij Cij , i, j {1, . . . , n},


n
n
X
X
(f )
(f )
Xji =
Xij , i {2, . . . , n 1},
j=1

unde
Deci X

(f )

D, unde
(

D=

X R

j=1

Cij = c(vi , vj ), i, j {1, . . . , n}.

nn



0 Xij Cij , i, j {1, . . . , n},

n
X
j=1

Xji

n
X
j=1

Xij = 0, i {2, . . . , n 1} .

69

TEMA 2. METODA GREEDY


Avem D Rnn , D =
6 (deoarece 0n D).
Considerand functia
F : D R, F (X) =

n
X
i=1

Xin

n
X

Xni ,

i=1

avem v(f ) = F (X (f ) ).
Rezulta ca un flux f n R este un flux de valoare maxima n R daca si
numai daca matricea X (f ) este un punct de maxim al functiei F (pe domeniul
D). F este o functie reala de n2 variabile reale.
Cum F este o functie continua, iar multimea D este compacta (adica
nchisa si marginita), rezulta ca F este marginita si si atinge marginile, deci
exista un punct de maxim X al functiei F (pe domeniul D).

Rezulta ca fluxul f definit prin X (f ) = X , adica


f : V V R, f (vi , vj ) = Xij , i, j {1, . . . , n},
este un flux de valoare maxima n reteaua R.
Conform Teoremei 2.6.1 rezulta ca nu exista lanturi de crestere n reteaua
R relativ la fluxul f . Fie
(
S = {i V | exista C-lanturi de la s la i n R relativ la f },
T = {i V | nu exista C-lanturi de la s la i n R relativ la f }.
Conform demonstratiei Teoremei 2.6.1 rezulta ca (S , T ) este o sectiune n
reteaua R si
v(f ) = c(S , T ),
deci conform Lemei 2.6.4 rezulta ca (S , T ) este o sectiune de capacitate
minima n reteaua R. Astfel avem
max{v(f ) | f = flux n R} = v(f ) = c(S , T )
= min{c(S, T ) | (S, T ) = sectiune n R}
Observatia 2.6.12. Conform demonstratiei teoremei anterioare, problema determinarii unui flux de valoare maxima ntr-o retea data este o problema de
optimizare liniara:

n
n

P
P
max
X

Xti
it
XRnn i=1
i=1
n
n
P
P

Xji
Xij = 0, i {1, . . . , n} \ {s, t};
j=1
j=1

0 Xij Cij , i, j {1, . . . , n}.

TEMA 2. METODA GREEDY

70

Deci aceasta problema poate fi rezolvata si prin algoritmii specifici optimizarii


liniare, cum ar fi algoritmul simplex. Totusi, datorita unor particularitati ale
problemei precum numarul mare de variabile si de restrictii sau alte restrictii
impuse fluxului (de exemplu conditia ca fluxurile sa fie numere ntregi), utilizarea algoritmilor specifici grafurilor este mai eficienta n rezolvarea problemei fluxului maxim.
Observatia 2.6.13. In termeni de optimizare matematica, notiunea de sectiune
este un concept dual pentru flux, iar problema sectiunii de capacitate minima
este o problema duala pentru problema fluxului de valoare maxima. Lema
2.6.4 reprezinta dualitatea slaba, iat Teorema 2.6.3 reprezinta dualitatea tare
dintre cele doua probleme.
Observatia 2.6.14. Din punct de vedere algoritmic, este important de semnalat faptul ca n orice retea multimea sectiunilor este finita (conform Observatiei 2.6.6), spre deosebire de multimea fluxurilor, care, n general, este
infinita. Astfel capacitatea maxima a unei sectiuni poate fi calculata prin
generarea tuturor sectiunilor (algoritm ineficient!), dar nu putem genera toate
fluxurile.
Observatia 2.6.15. Pentru o retea avand si capacitati numere irationale, Algoritmul Ford-Fulkerson poate sa fie inoperabil, fiind posibil ca numarul de
pasi ai algoritmului (numarul de lanturi de crestere succesive construite) sa
fie infinit, deoarece valorile reziduale ale lanturilor de crestere succesive con
P
rk1 (k ) convergenta.
struite pot forma o serie
k=1

Totusi, prin impunerea unor modalitati judicioase de construire a lanturilor de crestere succesive n cadrul Algoritmului Ford-Fulkerson, se obtin algoritmi care rezolva problema fluxului maxim si n cazul capacitatilor irationale.
Prezentam n continuare un astfel de algoritm, bazat pe parcurgerea n latime
(BF) a grafului rezidual.
Algoritmul Edmonds-Karp este un algoritm ce rezolva problema determinarii unui flux de valoare maxima si problema determinarii unei sectiuni
de capacitate minima ntr-o retea arbitrara, cu capacitati numere reale,
prin cresterea succesiva a valorii fluxului curent de-a lungul unor lanturi
de crestere, la fel ca n Algoritmul Ford-Fulkerson.
Algoritmul 2.6.2 (Edmonds-Karp). Fie R = (G, s, t, c) o retea, unde G =
(V, E).
Algoritmul Edmonds-Karp are aceeasi forma ca si Algoritmul Ford-Fulkerson, aceasta forma comuna fiind descrisa detaliat n pseudocod n Algoritmul
2.6.1. Singura deosebire este ca la fiecare pas se construieste un lant de
crestere (relativ la fluxul curent) de lungime minim
a (binenteles, doar
daca mai exista lanturi de crestere).

71

TEMA 2. METODA GREEDY

Acest lucru este realizat prin parcurgerea n l


atime (BF), pornind din
nodul sursa, a grafului rezidual relativ la fluxul curent.
Pentru a demonstra corectitudinea Algoritmului Edmonds-Karp, vom utiliza urmatoarea definitie.
Definitia 2.6.13. Fie f un flux n reteaua R = (G, s, t, c), unde G = (V, E).
Pentru orice doua noduri i, j V notam

min{l() | = C-lant de la i la j n R relativ la f }, daca exista


lf (i, j) =
C-lanturi de la i la j n R relativ la f ,

, n caz contrar,
unde l() reprezinta lungimea lantului .

Lema 2.6.5. Fie f un flux n reteaua R = (G, s, t, c), unde G = (V, E). Fie
un lant de crestere de lungime minima n reteaua R relativ la fluxul f si
fie f = f r() fluxul obtinut prin marirea fluxului f de-a lungul lantului
de crestere . Atunci au loc urmatoarele inegalitati:
lf (s, i) lf (s, i), i V,
lf (i, t) lf (i, t), i V.

(2.6.6)
(2.6.7)

Teorema 2.6.4 (de corectitudine a Algoritmului Edmonds-Karp).


contextul Algoritmului 2.6.2, fie R = (G, s, t, c) reteaua data, unde G =
In
(V, E) si c : E R+ .
Fie f0 fluxul initial (de exemplu f0 = fluxul nul). Fie k numarul de pasi ai
algoritmului (numarul de lanturi de crestere succesive construite), k > 0. Fie
1 , 2 , . . . , k lanturile de crestere succesive obtinute, si fie f1 = f0 r0 (1 ),
f2 = f1 r1 (2 ), . . . , fk = fk1 rk1(k ) fluxurile succesive obtinute,
unde 1 este lant de crestere de lungime minima relativ la f0 , 2 este lant
de crestere de lungime minima relativ la f1 , . . . , k este lant de crestere de
lungime minima relativ la fk1 , si nu mai exista lanturi de crestere relativ la
fk .
a) Numarul de pasi ai algoritmului este finit si verifica inegalitatea
k

mn
,
2

unde m = card (E) si n = card (V ).


b) fk este un flux de valoare maxima n reteaua R.
Exemplul 2.6.11. Pentru reteaua R din Figura 2.6.1, aplicarea Algoritmului
Edmonds-Karp este evidentiata n Figurile 2.6.11-2.6.15.

TEMA 2. METODA GREEDY

Figura 2.6.11:

Figura 2.6.12:

Figura 2.6.13:

72

TEMA 2. METODA GREEDY

73

Figura 2.6.14:

Figura 2.6.15:
Lanturile succesive de crestere relativ la fluxul curent sunt evidentiate
prin ngrosare, si anume:
1
2
3
4

= [1, 2, 3, 6],
= [1, 4, 3, 6],
= [1, 4, 5, 6],
= [1, 4, 3, 5, 6].

Fluxul reprezentat n Figura 2.6.15 este de valoare maxima, deoarece nu mai


exista lanturi de crestere n R relativ la acest flux. Valoarea acestui flux este
11.
Pentru acest flux maxim, avem C-lanturi de la nodul sursa s = 1 doar
la nodurile 1 si 4, aceste C-lanturi sunt evidentiate prin ngrosare n Figura

TEMA 2. METODA GREEDY

74

2.6.15. Conform (2.6.4) rezulta ca


(S, T ) = ({1, 4}, {2, 3, 5, 6})
este o sectiune de capacitate minima n R.
Observatia 2.6.16. Ca si Algoritmul Ford-Fulkerson, Algoritmul EdmondsKarp este tot un algoritm specific metodei de programare Greedy. Conform demonstratiei Teoremei 2.6.4, lanturile de crestere succesive 1 , 2 ,
. . . , k obtinute prin aplicarea Algoritmului Edmonds-Karp au lungimile n
ordine crescatoare, adica
l(1 ) l(2 ) l(k ).
Pentru o retea cu n noduri si m arce avand toate capacitatile numere reale
si pentru un flux initial dat, de exemplu fluxul nul, conform Teoremei 2.6.4
rezulta ca numarul de lanturi de crestere necesare maririi succesive a fluxului
initial, pana se ajunge la un flux de valoare maxima, este de cel mult mn
. Ca
2
si n cazul Algoritmului Ford-Fulkerson, pentru fiecare flux curent Algoritmul Edmonds-Karp necesita calculul reziduurilor celor m arce, parcurgerea
acestora (n latime) pentru depistarea unui eventual lant de crestere, determinarea acestui lant (de lungime cel mult m) si marirea fluxului curent de-a
lungul lantului de crestere, operatii avand complexitatea O (m). Rezulta ca
Algoritmul Edmonds-Karp are complexitatea O (m2 n).

Tema 3
Metoda Divide et Impera
3.1

Descrierea metodei. Algoritm general

Metoda Divide et Impera (dezbin


a si st
ap
aneste) este o metoda generala de elaborare a algoritmilor care implica trei etape:
Divide: Problema data este mpartita n doua sau mai multe subprobleme de acelasi tip, dar de dimensiuni mai mici.
Impera: Stapaneste subproblemele obtinute. Subproblemele se rezolva direct, daca dimensiunea lor permite aceasta (cazuri elementare),
sau, fiind de acelasi tip, se rezolva n mod recursiv, prin acelasi procedeu.
Combin
a: Se combina solutiile tuturor subproblemelor, pentru a obtine
solutia problemei initiale.
In continuare prezentam o schema generala de lucru.
Algoritmul 3.1.1 (Metoda Divide et Impera).
Fie A = (a1 , a2 , . . . , an ), n 1, un vector asupra componentelor caruia
trebuie efectuata o prelucrare. Presupunem ca:
p, q {1, 2, . . . , n}, cu p < q si q p , m {p, . . . , q 1}, astfel
ncat prelucrarea secventei
(ap , . . . , aq )
se poate face prelucrand succesiv subsecventele
(ap , . . . , am ) si
(am+1 , . . . , aq ),
75

TEMA 3. METODA DIVIDE ET IMPERA

76

dupa care, combinand rezultatele celor doua prelucrari, se obtine prelucrarea dorita a ntregii secvente (ap , . . . , aq ).
pentru secvente (ap , . . . , aq ), cu q p < , prelucrarea se poate face
direct, fara descompunere.
Algoritmul poate fi descris recursiv astfel:
DIVIMP(p, q, S) :
// Prelucrarea secvent
ei (ap , . . . , aq )
if q p < then
PRELUCREAZA(p, q, S); // Prelucrarea se face direct,
// rezult^
and solut
ia S a secvent
ei (ap , . . . , aq )
else
DESCOMPUNERE(p, q, m);
// Se descompune problema,
// adic
a se determin
a m
DIVIMP(p, m, S1);
// Se obt
ine solut
ia S1 pentru
// subsecvent
a (ap , . . . , am )
DIVIMP(m + 1, q, S2);
// Se obt
ine solut
ia S2 pentru
// subsecvent
a (am+1 , . . . , aq )
COMBINA(S1 , S2 , S);
// Se combin
a solut
iile S1 s
i S2 ,
// rezult^
and solut
ia S a secvent
ei (ap , . . . , aq )
Procedura trebuie apelata prin:
DIVIMP(1, n, S).
In acest algoritm:
reprezinta lungimea maxima a unei secvente (ap , . . . , aq ), notata prescurtat prin (p, q), pentru care prelucrarea se poate face direct, fara a
mai fi necesara mpartirea n subprobleme; procedura
PRELUCREAZA(p, q, S)
realizeaza prelucrarea secventelor de acest tip, furnizand rezultatul n
S.
Procedura

COMBINA(S1 , S2 , S)

realizeaza combinarea rezultatelor S1 , S2 ale prelucrarii celor doua subsecvente vecine (p, m) si (m + 1, q), obtinandu-se rezultatul S al prelucrarii secventei (p, q).
Valoarea m este obtinuta apeland procedura
DESCOMPUNERE(p, q, m).

TEMA 3. METODA DIVIDE ET IMPERA

3.2

77

Problema turnurilor din Hanoi

Se dau trei tije notate cu 1, 2, 3 si n 1 discuri perforate de diametre diferite.


Initial, toate discurile se afla pe tija 1, n ordinea crescatoare a diametrelor,
considerand sensul de la varf catre baza.
Se cere mutarea discurilor pe tija 2, n aceeasi ordine, utilizand tija 3 si
respectand urmatoarele reguli:
la fiecare pas se muta un singur disc;
nu este permisa asezarea unui disc peste unul cu diametru mai mic.

Rezolvare. Vom nota o mutare cu perechea (i, j), ceea ce semnifica faptul ca
se muta un disc de pe tija i pe tija j (i, j {1, 2, 3}).
Daca n = 1, avem mutarea (1, 2).
Daca n = 2, avem mutarile (1, 3), (1, 2), (3, 2).
Daca n > 2, problema se complica.
Notam cu H(m, i, j) sirul mutarilor necesare pentru a muta primele m
discuri de pe tija i pe tija j, folosind pentru manevre cealalta tija k := 6ij.
(Avem i + j + k = 1 + 2 + 3 = 6.)
Rezulta ca, pentru problema noastra, avem de determinat sirul H(n, 1, 2).
Avem

(i, j),
daca m = 1,
H(m, i, j) =
H(m 1, i, k), (i, j), H(m 1, k, j), daca m 2.

TEMA 3. METODA DIVIDE ET IMPERA

78

Asadar, pentru m 2, mutarea a m discuri de pe tija i pe tija j este


echivalenta cu:
mutarea a m 1 discuri de pe tija i pe tija k := 6 i j, utilizand
pentru manevre tija j;
mutarea discului ramas de pe tija i pe tija j;
mutarea celor m 1 discuri de pe tija k pe tija j, utilizand pentru
manevre tija i.
Deci rezolvarea unei probleme de dimensiune m 2 se reduce la rezolvarea
a trei probleme, de acelasi tip, dar de dimensiuni mai mici:
doua de dimensiune m 1, care se vor rezolva, recursiv, n acelasi mod;
una de dimensiune 1, care se rezolva direct.

Descrierea n pseudocod a algoritmului are urmatoarea forma.
HANOI(m, i, j) :
if m = 1 then
afiseaz
a(i, j);
// se afi
seaz
a mutarea (i, j)
else
k 6 i j;
HANOI(m 1, i, k);
afiseaz
a(i, j);
// se afi
seaz
a mutarea (i, j)
HANOI(m 1, k, j);
Procedura trebuie apelata prin:
HANOI(n, 1, 2).

TEMA 3. METODA DIVIDE ET IMPERA

79

Observatia 3.2.1. Algoritmul anterior este, sevident, un algoritm pecific metodei de programare Divide et Impera. Pentru evaluarea complexutatii
acestui algoritm, vom nota cu M(n) numarul de mutari afisate. Avem

M(n) =
=

1,
daca n = 1,
M(n 1) + 1 + M(n 1), daca n 2,
1,
daca n = 1,
2 M(n 1) + 1, daca n 2.

Prin inductie se obtine ca


M(n) = 2n 1.
Astfel rezulta ca timpul de executie al algoritmului este T (n) = (2n ),
deci exponential.

3.3

C
autarea binar
a

Problema c
aut
arii este urmatoarea:
Se considera un vector A = (a1 , a2 , ..., an ) si o valoare x. Se cere sa se
determine daca x se afla printre componentele vectorului A.
O cautare se poate ncheia
fie cu succes, caz n care se returneaza o pozitie n vector pe care se
afla valoarea cautata;
fie f
ar
a succes, caz n care se returneaza 1.

Observatia 3.3.1. In practica, problema cautarii consta n regasirea unei


nregistrari ntr-un fisier sau baza de date dupa valoarea unui camp, numit
cheie de c
autare.
Algoritmul 3.3.1 (C
autarea binar
a).
Presupunem ca vectorul A are elementele n ordine crescatoare
a1 a2 an .
Vom utiliza metoda Divide et Impera astfel:
se compara x cu elementul median (din mijloc) am , unde


1+n
m=
2
([x] reprezinta partea ntreaga a numarului x R);

TEMA 3. METODA DIVIDE ET IMPERA

80

daca am = x, atunci cautarea se termina cu succes;


daca am > x, atunci se va cauta x n subsecventa
(a1 , . . . , am1 ) ;
daca am < x, atunci se va cauta x n subsecventa
(am+1 , . . . , an ) .
Varianta recursiv
a de implementare a algoritmului de cautare binara
este descrisa n pseudocod astfel:
CAUTBIN REC(A, n, p, u, x) :
// c
autarea valorii x ^
n subsecvent
a (ap , . . . , au ) a
// vectorului (a1 , . . . , an )
if p > u then
returneaz
a 1;
else


p+u
;
m
2
if x = A[m] then
returneaz
a m;
else
if x < A[m] then
returneaz
a CAUTBIN REC(A, n, p, m 1, x);
else
returneaz
a CAUTBIN REC(A, n, m + 1, u, x);
Procedura trebuie apelata prin:
poz CAUTBIN REC(A, n, 1, n, x).
Varianta iterativ
a de implementare a algoritmului de cautare binara
este descrisa n pseudocod astfel:

TEMA 3. METODA DIVIDE ET IMPERA

81

CAUTBIN(A, n, x) :
p 1; u n;
// (ap , . . . , au ) reprezint
a subsecvent
a curent
a
// la care se restr^
ange c
autarea
while p
u
do


p+u
;
m
2
if x = A[m] then
returneaz
a m;
else
if x < A[m] then
u m 1;
else
p m + 1;
returneaz
a 1;
Procedura trebuie apelata prin:
poz CAUTBIN(A, n, x).
Observatia 3.3.2. Pentru analiza algoritmului de cautare binara, presupunem
ca la fiecare iteratie avem o singura comparatie de chei, n urma careia se
poate decide ce relatie de ordine exista ntre valorile comparate.
Teorema 3.3.1 (complexitatea algoritmului de c
autare binar
a). Pentru algoritmul CAUTBIN, o cautare cu succes necesita cel mult k comparatii
de chei, iar o cautare fara succes necesita k 1 sau k comparatii de chei,
unde
k = [log2 n] + 1,
deci algoritmul are complexitatea O (log2 n).
Demonstratie. Pentru algoritmul de cautare binara ntr-un vector sortat cu
n componente, se poate asocia un arbore binar (de decizie) cu
n noduri interioare, etichetate cu numerele 1, 2, . . . , n reprezentate n
cercuri;
n+1 noduri terminale, etichetate cu numerele 0, 1, 2, . . . , n reprezentate
n patrate,
construit recursiv astfel:
a) daca n = 0, arborele este constituit din nodul 0 ;
b) altfel, daca n 1, atunci:

TEMA 3. METODA DIVIDE ET IMPERA

82


n+1
este nod r
ad
acin
a (nodul median este radacina);

2
subarborele st
ang este arborele
binar

 corespunzator cautarii
n+1
binare ntr-un vector sortat cu
1 componente;
2
subarborele drept este arborele
h n i binar corespunzator cautarii
binare ntr-un vector sortat cu
componente, numerele nodu 2

n+1
.
rilor fiind crescute cu
2


De exemplu, pentru n = 9 avem urmatorul arbore binar asociat:

La cautarea binara a valorii x n vectorul sortat (a1 , . . . , an ), semnificatia


nodurilor arborelui este urmatoarea:
pentru orice i {1, 2, . . . , n}, nodul interior etichetat cu i reprezinta
comparatia valorii cautate, x, cu elementul ai din vectorul sortat;
pentru orice i {0, 1, 2, . . . , n}, nodul terminal etichetat cu i reprezinta
ncheierea fara succes a procesului de cautare, corespunzatoare situatiei:
x < a1 ,
daca i = 0,
ai < x < ai+1 , daca 1 i n 1,
x > an ,
daca i = n.
La o cautare, numarul de comparatii de chei este egal cu numarul de
noduri neterminale care se gasesc pe lantul care uneste nodul radacina cu
nodul terminal care reprezinta sfarsitul procesului de cautare.
De exemplu, pentru n = 9 si vectorul sortat
A = (2, 6, 12, 14, 16, 18, 20, 25, 50),

TEMA 3. METODA DIVIDE ET IMPERA

83

cautarea valorii x = 13 necesita 4 comparatii, puse n evidenta de lantul


care uneste radacina, etichetata cu 5, cu nodul terminal etichetat cu 3 din
arborele asociat:

Considerand ca radacina arborelui este reprezentata pe nivelul 0 si notand


cu k numarul de niveluri ale arborelui (adica lungimea maxima de la radacina
la un nod terminal), rezulta ca:
o cautare cu succes necesita cel mult k comparatii de chei;
o cautare fara succes necesita k 1 sau k comparatii de chei.
Pe nivelele 0, 1, . . . , k 2 avem doar noduri neterminale, fiecare avand
cate doi fii (adica succesori directi situati pe nivelul imediat urmator).
Rezulta ca pentru orice i {0, 1, . . . , k 1} pe nivelul i avem exact 2i
noduri.
Pe penultimul nivel, k 1, putem avea si noduri terminale, iar nodurile
neterminale de pe acest nivel au de asemenea cate doi fii.
Pe ultimul nivel, k, avem doar noduri terminale.
Notand cu a numarul de noduri neterminale de pe penultimul nivel si cu
b numarul de noduri terminale de pe acelasi nivel, obtinem ca
a + b = 2k1
(numarul total de noduri de pe penultimul nivel, nivelul k 1), iar
a1
(pe penultimul nivel exista cel putin un nod neterminal).

(3.3.1)

TEMA 3. METODA DIVIDE ET IMPERA

84

Pe primele k 2 niveluri nu avem noduri terminale, pe penultimul nivel,


k 1, avem b noduri terminale, iar pe ultimul nivel, k, avem 2a noduri
terminale (si anume fii celor a noduri neterminale de pe penultimul nivel),
deci numarul total de noduri terminale ale arborelui este egal cu b + 2a.
Rezulta ca
b + 2a = n + 1.
(3.3.2)
Din relatiile (3.3.1) si (3.3.2) obtinem ca
a = n + 1 2k1.
Dar 1 a 2k1 (a doua inegalitate rezulta din (3.3.1)), deci
1 n + 1 2k1 2k1 .
Rezulta ca
2k1 n si 2k n + 1 > n,
deci
k 1 log2 n < k
si astfel
k = [log2 n] + 1.
Prin urmare, timpul de executie pentru algoritmul de cautare binara este de
ordinul O (log2 n).

Observatia 3.3.3. In cazul unei cautari fara succes, eticheta nodului terminal
n care se ajunge, poate determina pozitia pe care ar trebui inserata n vector
valoarea cautata, astfel ncat vectorul sa ramana n continuare sortat.

3.4

Sortarea prin interclasare (mergesort)

Se da un vector A = (a1 , a2 , ..., an ). Problema sort


arii consta n a ordona
crescator (sau descrescator ) elementele acestui vector.
Observatia 3.4.1. In practica, problema apare, n general, n ordonarea crescatoare (sau descrescatoare) a unei multimi finite de articole (nregistrari)
dupa un camp (sau mai multe) numit cheie.
Algoritmul 3.4.1 (Sortarea prin interclasare). Se interclaseaza succesiv
secvente ordonate crescator ale vectorului initial, pana se obtine secventa cu
toate elementele sortate ale vectorului initial.
Se utilizeaza metoda Divide et Impera:

TEMA 3. METODA DIVIDE ET IMPERA

85

pentru a sorta un vector cu n componente l mpartim n doi vectori


care odata sortati se interclaseaza;
un vector cu o singura componenta este sortat.
SORTINT(A, p, q) :
if p < q then


p+q
;
m
2
SORTINT(A, p, m);
SORTINT(A, m + 1, q);
INTERCLAS(A, p, q, m);
Apel: SORTINT (A, 1, n).
Pentru interclasare se va utiliza un vector intermediar, de lucru, B. Mai
ntai se interclaseaza cele doua secvente (A[p], ..., A[m]) si (A[m+1], ..., A[q]),
rezultatul interclasarii depunandu-se n vectorul B:

Apoi rezultatul interclasarii va fi copiat din B n A, ntre pozitiile p si q:

TEMA 3. METODA DIVIDE ET IMPERA

86

INTERCLAS(A, p, q, m) :
i p;
j m + 1;
k 1;
while (i m) and (j q) do
if A[i] A[j] then
B[k] A[i];
i i + 1;
else
B[k] A[j];
j j + 1;
k k + 1;
while i m do
B[k] A[i];
i i + 1;
k k + 1;
while j q do
B[k] A[j];
j j + 1;
k k + 1;
k 1;
for i = p, q do
A[i] B[k];
k k + 1;
Observatia 3.4.2. Chiar daca timpul de executie este de apreciat, se utilizeaza
un vector suplimentar de lucru, B.
Observatia 3.4.3. Complexitatea algoritmului este de ordinul O (n ln n).
Observatia 3.4.4. Se poate mbunatati procedura INTERCLAS, micsorand
numarul de deplasari.
T
inem seama de urmatoarele:
1) Daca primul ciclu se termina cand i > m, atunci elementele ramase n
secventa (A[j], ..., A[q]) nu vor mai fi copiate n vectorul B, pentru ca
apoi sa fie readuse n A, deoarece ele ocupa deja pozitiile corecte.

TEMA 3. METODA DIVIDE ET IMPERA

87

2) Daca primul ciclu se termina cand j > q, atunci elementele ramase n


secventa (A[i], ..., A[m]) vor fi copiate direct n vectorul A, pe pozitiile
q m + i, q m + i + 1, , q,
fara a le mai transfera n B si apoi, de aici, n A.

Pentru a evita eventualele suprapuneri nedorite, copierea se va face n


ordine inversa.

TEMA 3. METODA DIVIDE ET IMPERA

88

INTERCLAS2(A, p, q, m) :
i p;
j m + 1;
k 1;
while (i m) and (j q) do
if A[i] A[j] then
B[k] A[i];
i i + 1;
else
B[k] A[j];
j j + 1;
k k + 1;
if j q then
lim j 1;
else
lim q m + i 1;
for j = m, i, 1 do
A[q m + j] A[j];
k 1;
for i = p, lim do
A[i] B[k];
k k + 1;

3.5

Sortarea rapid
a (quicksort)

Denumirea algoritmului se datoreaza faptului ca s-a dovedit a fi unul dintre


cei mai performanti (rapizi) algoritmi de sortare bazati pe comparatii de chei.
In prezent, exista foarte multe variante ale acestui algoritm, menite sa
micsoreze timpul de executie n cazurile cele mai defavorabile.
Data fiind simplitatea sa, pentru nceput, vom descrie varianta clasica a
acestui algoritm.
Algoritmul 3.5.1 (Sortarea rapid
a). Se foloseste metoda Divide et Impera, pornindu-se de la ideea ca, pentru orice secventa
(A[p], ..., A[u]), p < u,
printr-un procedeu de rearanjare (interschimbari succesive) se poate ajunge
la situatia
(A[p], ..., A[k], ..., A[u])

TEMA 3. METODA DIVIDE ET IMPERA

89

n care
A[i] A[k] A[j],

(3.5.1)

pentru orice i si j cu p i k 1 si k + 1 j u.
Se obtin, astfel, doua secvente mai mici (partitii)
(A[p], ..., A[k 1]) si (A[k + 1], ..., A[u]),
care pot fi prelucrate (sortate), n acelasi mod, independent una de alta.
Secventele de lungime 1 sau cele vide care rezulta n urma partitionarii nu
se mai prelucreaza.
Un element A[k], care satisface relatia (3.5.1), se numeste pivot. El are
proprietatea ca a ajuns deja pe pozitia finala, n viitorul vectorul sortat,
deoarece
toate elementele din secventa (A[p], ..., A[k 1]) sunt mai mici sau egale
cu el;
toate elementele din secventa (A[k+1], ..., A[u]) sunt mai mari sau egale
cu el.
In final, spre deosebire de algoritmul mergesort, n care la etapa de combinare se realiza interclasarea celor doua secvente sortate, aici aceasta etapa
este evitata deoarece, n urma prelucrarilor celor doua secvente, rezulta deja
toata secventa (A[p], ..., A[u]) sortata.

Exemplul 3.5.1.

Determinarea pivotului:
Se compara A[p], pe rand, cu A[u], A[u 1], ... s.a.m.d. pana cand se
ajunge la o pozitie u cu A[p] > A[u ]. Atunci se executa urmatoarele
operatii

A[p] A[u ]
pp+1

u u

TEMA 3. METODA DIVIDE ET IMPERA

90

In continuare, se compara A[u], pe rand, cu A[p], A[p + 1], ... s.a.m.d.


pana cand se ajunge la o pozitie p cu A[p ] > A[u]. Atunci se executa
urmatoarele operatii

A[p ] A[u]
p p

uu1

Se reiau pasii anteriori pentru noua secventa (A[p], ..., A[u]).


Algoritmul se termina cand avem p = u si atunci luam
k = p = u.
QUICKSORT(A, p, u) :
if p < u then
k PIVOT(A, p, u); // Se determin
a pozit
ia k a pivotului
QUICKSORT(A, p, k 1);
QUICKSORT(A, k + 1, u);
Apel: QUICKSORT (A, 1, n).
PIVOT(A, p, u) :
cp 0;
// Pasul de cre
stere a lui p
cu 1;
// Pasul de cre
stere a lui u
while p < u do
if A[p] > A[u] then
A[p] A[u];
m cp;
// Se interschimb
a (cu semn inversat)
cp cu;
// valorile pa
silor de cre
stere
cu m;
p p + cp;
u u + cu;
k p;
returneaz
a k;

TEMA 3. METODA DIVIDE ET IMPERA

91

Analiza algoritmului:
Vom evalua numarul de comparatii (de chei), celelalte operatii nedepasind
ordinul de marime al acestora.
In procedura PIVOT se efectueaza u p comparatii (de chei).
Daca vectorul A este de la nceput sortat crescator, atunci procedura
PIVOT va fi apelata succesiv pentru perechile de indici
(1, n); (2, n); ...; (n 1, n),
ceea ce necesita
(n 1) + (n 2) + + 2 + 1 =

n(n 1)
comparatii.
2

Prin urmare, n cazul cel mai defavorabil, complexitatea algoritmului este


de ordinul O (n2 ).
Propozitia 3.5.1. Valoarea medie T (n) a numarului de comparatii de chei
este
T (n) = (n ln n).
Imbun
at
atiri ale algoritmului quicksort
Algoritmul quicksort este ineficient n situatiile n care se ntampla ca n mod
sistematic, n cele mai multe apelari succesive, cele doua partitii care se obtin
sa fie foarte neechilibrate (adica sa aiba lungimi diferite, una foarte mare
si cealalta foarte mica). Cu cat dimensiunile celor doua partitii sunt mai
apropiate cu atat se reduce numarul comparatiilor de chei efectuate.
Un mod de a realiza echilibrarea consta n ncercarea de a obtine ca pivot
elementul de pe pozitia mediana a secventei de sortat.
De asemenea, n cazurile cele mai defavorabile (vector deja sortat), la
vectori de dimensiuni mari, este posibila aparitia unor erori la executie de
genul depasirea stivei (stack overflow ). Unele dintre aceste situatii pot fi
evitate, daca se elimina apelurile recursive inutile.

TEMA 3. METODA DIVIDE ET IMPERA


QUICKSORT2(A,
p, u) :


u+p
;
k
2

92

// Se determin
a pozit
ia median
a

// a secvent
ei de sortat
med A[k];
// Se ret
ine elementul de pe pozit
ia median
a
min p;
max u;
repeat
while A[min] < med do
min min + 1
while A[max] > med do
max max 1
if min max then
A[min] A[max]
min min + 1;
max max 1;
while min max;
if p < max then
QUICKSORT2(A, p, max);
if u > min then
QUICKSORT2(A, min, u);

Apel: QUICKSORT2 (A, 1, n).

3.6

O problem
a de acoperire

O suprafata patrata cu lungimea laturii n = 2k , k 1, este divizata ca o


tabla de sah n patrate unitare. Unul dintre aceste patrate unitare este deja
acoperit. Sa se arate cum se poate acoperi suprafata ramasa cu placi de
forma

constand din trei patrate unitare.


Idee de rezolvare:
Se mparte suprafata patrata n patru patrate egale, formandu-se patru
suprafete patrate cu lungimea laturii 2k1 . Una dintre suprafete are deja
un patrat unitar acoperit. Acoperim cu o placa n celelalte trei suprafete, ca
mai jos:

TEMA 3. METODA DIVIDE ET IMPERA

93

Fiecare dintre cele patru suprafete este acum n conditiile problemei, deci
pentru fiecare suprafata se repeta procedeul de descompunere descris anterior.

TEMA 3. METODA DIVIDE ET IMPERA

94

ACOPERIRE(S, i, j, n, ip, jp) :


// S=matricea ce va fi completat
a cu numerele pl
acilor
// (i, j)=colt
ul st^
anga sus
// n=lungimea laturii
// (ip, jp) = coordonatele p
atratului unitar acoperit
if (n > 1) then
p p + 1;
// num
arul pl
acii
m n/2;
// noua dimensiune a laturii
// Coordonatele st^
anga sus ale celor 4 p
atrate:
i1 i; j1 j;
i2 i; j2 j + m;
i3 i + m; j3 j;
i4 i + m; j4 j + m;
// Coordonatele p
atratelor unitare ce vor fi acoperite
// ^
n cele 4 p
atrate:
ip1 ip; jp1 jp;
ip2 ip; jp2 jp;
ip3 ip; jp3 jp;
ip4 ip; jp4 jp;
if (i3 ip) then
ip1 i1 + m 1; jp1 j1 + m 1;
ip2 i2 + m 1; jp2 j2;
S[ip1][jp1] p; S[ip2][jp2] p;
else
ip3 i3; jp3 j3 + m 1;
ip4 i4; jp4 j4;
S[ip3][jp3] p; S[ip4][jp4] p;
if (j2 jp) then
ip1 i1 + m 1; jp1 j1 + m 1;
ip3 i3; jp3 j3 + m 1;
S[ip1][jp1] p; S[ip3][jp3] p;
else
ip2 i2 + m 1; jp2 j2;
ip4 i4; jp4 j4;
S[ip2][jp2] p; S[ip4][jp4] p;
ACOPERIRE(S, i1, j1, m, ip1, jp1);
ACOPERIRE(S, i2, j2, m, ip2, jp2);
ACOPERIRE(S, i3, j3, m, ip3, jp3);
ACOPERIRE(S, i4, j4, m, ip4, jp4);
Apel: ACOPERIRE(S, 1, 1, n, ip, jp).

Tema 4
Metoda program
arii dinamice
4.1

Descrierea metodei. Algoritm general

Ca si metoda Divide et Impera, metoda program


arii dinamice implica
rezolvarea unei probleme prin descompunerea n subprobleme de acelasi tip
de dimensiuni mai mici, dar de aceasta data subproblemele nu sunt disjuncte
(ca la metoda Divide et Impera), ci se pot suprapune, n sensul ca doua
subprobleme pot avea (sub)subprobleme comune.
Solutia problemei se construieste combinand solutiile subproblemelor, numite si subsolutii (solutii partiale).
Metoda se adreseaza problemelor de optimizare care ndeplinesc principiul optimalit
atii al lui Bellman: orice subsolutie a unei solutii optime
este la randul ei o solutie optima pentru subproblema corespondenta.
De regula, subproblemele se rezolva n ordinea crescatoare a dimensiunii lor (strategia bottom-up), iar, pentru a evita repetarea procesului de
calcul necesar rezolvarii aceleiasi subprobleme, solutiile subproblemelor se
memoreaza temporar (de obicei n structuri de date de tip tablouri) pentru
reutilizari la posibile viitoare apeluri ale acestor subprobleme.
Solutiile optime ale problemelor se exprima n functie de solutiile optime
ale subproblemelor lor, de obicei prin intermediul unor relatii de recurent
a,
si astfel determinarea solutiilor optime revine la scrierea si rezolvarea acestor
relatii de recurenta.
Relatiile de recurenta pot fi rezolvate si prin implementari recursive, n
care solutia optima a problemei apeleaza solutiile optime ale subproblemelor
(de dimensiuni mai mici, strategia top-down), dar n acest caz calculul
necesar rezolvarii unei aceleiasi subprobleme poate fi reluat de foarte multe
ori prin apelarea repetata a acesteia, ceea ce conduce frecvent la un timp de
calcul exponential.

95


TEMA 4. METODA PROGRAMARII
DINAMICE

96

Deci este de preferat ca relatiile de recurenta sa fie rezolvate prin implementari nerecursive, utilizand strategia bottom-up, cu memorarea temporara
a solutiilor optime ale subproblemelor.
Prezentam o schema generala de lucru:
Problema data se descompune n subprobleme de acelasi tip, dar de
dimensiuni mai mici.
Se alege o structura de date n care se memoreaza solutiile optime ale
problemei si subproblemelor.
Se determina relatia de recurenta ce caracterizeaza solutia optima.
Se rezolva relatia de recurenta prin strategia bottom-up.

4.2

Subsir cresc
ator de lungime maxim
a

Se considera un sir de numere reale


a1 , a2 , . . . , an , n 1.

Se cere sa se determine un subsir crescator de lungime maxima, adica un


subsir
ai1 ai2 aik
(1 i1 < i2 < < ik n) cu k= maxim.
De exemplu, pentru sirul

10, 16, 2, 8, 4, 10, 3, 4, 9, 8


lungimea maxima a unui subsir crescator este egala cu 4 (nu exista subsiruri
crescatoare de lungime 5), iar un subsir crescator de lungime maxima este,
de exemplu,
2, 3, 4, 8.
Rezolvare. Consideram subproblemele constand n determinarea a cate unui
subsir crescator de lungime maxima care ncepe cu elementul ai , pentru orice
i {1, 2, . . . , n}.
Pentru memorarea solutiile subproblemelor utilizam doi vectori L si P
avand semnificatia
L[i] = lungimea maxima a unui subsir crescator care ncepe cu elementul ai ,
P [i] = indicele primului element care este succesor al lui ai ntr-un subsir
crescator de lungime maxima care ncepe cu ai , daca exista un astfel
de indice,
P [i] = 1, daca nu exista un astfel de indice,


TEMA 4. METODA PROGRAMARII
DINAMICE

97

pentru orice i {1, 2, . . . , n}.


Evident,
L[n] = 1, P [n] = 1,

L[i] = max {1 + L[j] | ai aj }, daca exista un astfel de indice j,


j=i+1,n

L[i] = 1, daca nu exista un astfel de indice j,


P [i] = min {j | L[i] = 1 + L[j]}, daca exista un astfel de indice j,
j=i+1,n

P [i] = 1, daca nu exista un astfel de indice j,

pentru orice i {1, 2, . . . , n 1}.


Rezolvarea relatiei de recurenta a numerelor L[i] si calculul numerelor
P [i] conform strategiei bottom-up revine la calculul acestor numere n ordinea
inversa a indicilor, adica
i = n, n 1, . . . , 2, 1.
O solutie a problemei este subsirul

de lungime

at1 at2 atk


k = max L[i],
i=1,n

construit astfel:
t1 = min {i | L[i] = k},
i=1,n

tj = P [tj1 ], j {2, . . . , k}.

Pentru exemplul din enunt avem n = 10,


L[10] = 1,
L[9] = 1,
L[8] = 2,
L[7] = 3,
L[6] = 1,
L[5] = 3,
L[4] = 2,
L[3] = 4,
L[2] = 1,
L[1] = 2,

P [10] = 1;
P [9] = 1;
P [8] = 9;
P [7] = 8;
P [6] = 1;
P [5] = 8;
P [4] = 6;
P [3] = 5;
P [2] = 1;
P [1] = 2,


TEMA 4. METODA PROGRAMARII
DINAMICE

98

deci lungimea maxima a unui subsir crescator este


k=4
iar un subsir crescator de lungime maxima este dat de indicii
t1 = 3, t2 = P [t1 ] = 5, t3 = P [t2 ] = 8, t4 = P [t4 ] = 9,
adica subsirul
2, 4, 4, 9.

Descrierea n pseudocod a algoritmului are urmatoarea forma.
SUBSIRMAX(a, n) :
L[n] 1;
P [n] 1;
for i = n 1, 1, 1 do
L[i] 1;
P [i] 1;
for j = i + 1, n do
if (aj ai ) and (1 + L[j] > L[i]) then
L[i] 1 + L[j];
P [i] j;
k L[1];
t1 1;
for i = 2, n do
if (L[i] > k) then
k L[i];
t1 i;
for j = 2, k do
tj P [tj1];

for j = 1, k do
afiseaz
a atj ;

4.3

Matricea drumurilor.
Warshall

Algoritmul Roy-

Definitia 4.3.1. Fie G = (V, E) un graf (neorientat sau orientat), unde


V = {v1 , . . . , vn }. Matricea drumurilor asociata grafului G este matricea


TEMA 4. METODA PROGRAMARII
DINAMICE

99

D = (dij )i,j=1,n definita prin



1, daca = (vi , . . . , vj ) drum cu l() > 0,
dij =
0, n caz contrar,
unde l() reprezinta lungimea drumului .
Exemplul 4.3.1. Matricea drumurilor
plul 1.2.1 este

1 1
1 1

0 0
D=
1 1

1 1
0 0

asociata grafului neorientat din Exem0


0
1
0
0
1

iar matricea drumurilor asociata grafului

1 1 1
1 1 1

D=
1 1 1
0 0 0
0 0 0

1
1
0
1
1
0

1
1
0
1
1
0

0
0
1
0
0
1

orientat din Exemplul 1.2.2 este

1 1
1 1

1 1
.
0 0
1 0

Observatia 4.3.1. Evident, orice graf neorientat are matricea drumurilor simetrica.
Observatia 4.3.2. Conform Observatiei 1.5.5, pentru i 6= j putem nlocui
termenul de drum cu drum elementar n definitia matricei drumurilor.
Urmatorul algoritm determina matricea drumurilor unui graf pornind de
la matricea de adiacenta.
Algoritmul 4.3.1 (Roy-Warshall). Fie G = (V, E) un graf simplu cu V =
{v1 , . . . , vn } si fie A = (aij )i,j=1,n matricea sa de adiacenta (avand toate
elementele 0 sau 1). Se calculeaza matricele
(k)

D (k) = (dij )i,j=1,n , k {0, 1, . . . , n},


definite prin
D (0) = A,
(k)
dij

(k1)
dij

(4.3.1)

(k1) (k1)
dik dkj ,

k, i, j {1, . . . , n},

(4.3.2)

unde 0 0 = 0, 0 1 = 1 0 = 1 1 = 1 (operatia de disjunctie, sau).


TEMA 4. METODA PROGRAMARII
DINAMICE

100

Teorema 4.3.1 (de corectitudine a Algoritmului Roy-Warshall). In


contextul Algoritmului Roy-Warshall, ultima matrice calculata este chiar matricea drumurilor asociata grafului G, adica
D (n) = D.
Demonstratie. Vom demonstra prin inductie dupa k {0, 1, . . . , n} ca pentru
orice i, j {1, . . . , n} avem

1, daca = (vi , . . . , vj ) drum cu l() > 0 si I() {v1 , . . . , vk },
(k)
dij =
0, n caz contrar,
(4.3.3)
unde l() reprezinta lungimea drumului , I() reprezinta multimea nodurilor
intermediare ale drumului , iar {v1 , . . . , vk } reprezinta multimea {vi |, 1
i k}, deci pentru k = 0 aceasta multime este .
Pentru k = 0 avem

1, daca (vi , vj ) E,
(0)
dij = aij (conform (4.3.1)) si aij =
0, n caz contrar

(din definitia matricei de adiacenta), iar (vi , vj ) E daca si numai daca


= (vi , . . . , vj ) drum cu l() > 0 si I() = , deci obtinem egalitatea
(4.3.3).
Presupunem acum egalitatea (4.3.3) adevarata pentru k 1 (1 k n)
si o demonstram pentru k. Folosind (4.3.2), definitia operatiilor si si
ipoteza de inductie avem echivalentele:
(k)

(k1)

dij = 1 dij

(k1)

= 1 sau dik

(k1)

= dkj

= 1 = (vi , . . . , vj ) drum cu

l() > 0, I() {v1 , . . . , vk1 } sau 1 = (vi , . . . , vk ), 2 = (vk , . . . , vj )


drumuri cu l(1 ), l(2) > 0, I(1 ), I(2 ) {v1 , . . . , vk1}
= (vi , . . . , vj ) cu l() > 0, I() {v1 , . . . , vk }, vk 6 I() sau
= (vi , . . . , vk , . . . , vj ) cu l( ) > 0, I( ) {v1 , . . . , vk }, vk I( )

( se obtine parcurgand ntai 1 apoi 2 si, reciproc, 1 , 2 sunt portiunile


din dintre vi si prima aparitie a lui vk n I( ), respectiv dintre ultima
aparitie a lui vk n I( ) si vj )
= (vi , . . . , vj ) drum cu l() > 0 si I() {v1 , . . . , vk }.
Demonstratia prin inductie a egalitatii (4.3.3) este astfel ncheiata.
Pentru k = n conditia I() {v1 , . . . , vn } poate fi eliminata, fiind
ntotdeauna adevarata, deci din (4.3.3) si Definitia 4.3.1 obtinem ca
(n)

dij = dij , i, j {1, . . . , n},


adica egalitatea din enunt.


TEMA 4. METODA PROGRAMARII
DINAMICE

101

Observatia 4.3.3. Pentru n fixat, Algoritmul Roy-Warshall necesita 2n3 operatii (cate o operatie si pentru fiecare (k, i, j) {1, . . . , n} {1, . . . , n}
{1, . . . , n}), deci acest algoritm are complexitatea (n3 ).
Observatia 4.3.4. Algoritmul Roy-Warshall ramane evident valabil si pentru
grafuri nesimple, cu modificarea

1, daca aij > 0,
(0)
i, j {1, . . . , n}.
dij =
0, daca aij = 0,
Exemplul 4.3.2. Pentru graful din Exemplul 1.2.2, prin aplicarea Algoritmului Roy-Warshall obtinem matricele:

0 1 0 0 0
0 0 1 1 1

(0)

D =A=
1 1 0 0 0 (matricea de adiacenta);
0 0 0 0 0
0 0 0 1 0

(1)

0
0
1
0
0

1
0
1
0
0

0
1
0
0
0

0
1
0
0
1

(2)

(1)

(deoarece, de exemplu, d13 = d13

1 1 1 1 1
1 1 1 1 1

D (3) =
1 1 1 1 1
0 0 0 0 0
0 0 0 1 0

(5)

1
1
1
0
0

1
1
1
0
0

1
1
1
0
0

1
1
1
0
1

0
1
0
0
0

(2)
; D =

(1) (1)

0
0
1
0
0

1
0
1
0
0

1
1
1
0
0

1
1
1
0
1

1
1
1
0
0

d12 d23 = 0 1 1 = 0 1 = 1);

1 1 1 1 1
1 1 1 1 1

; D (4) = 1 1 1 1 1 ;

0 0 0 0 0

0 0 0 1 0

1
1
1
0
0

= D (matricea drumurilor).

Observatia 4.3.5. Conform ecuatiilor (4.3.3), Algoritmul Roy-Warshall este


un algoritm specific metodei program
arii dinamice.


TEMA 4. METODA PROGRAMARII
DINAMICE

102
(k)

(k1)

Conform ecuatiilor (4.3.2) si definitiei operatiei avem dik = dik


si
(k)
(k1)
dkj = dkj , k, i, j {1, . . . , n}, deci pentru implementarea algoritmului
putem utiliza o singura matrice D. Astfel obtinem urmatoarea descriere n
pseudocod a algoritmului.
ROY WARSHALL :
for i = 1, n do
// init
ializ
ari
for j = 1, n do
dij aij ;
for k = 1, n do
for i = 1, n do
for j = 1, n do
dij dij dik dkj ;
Pentru grafuri oarecare (simple sau nesimple) initializarea are forma
for i = 1, n do
// init
ializ
ari
for j = 1, n do
if (aij > 0) then
dij 1;
else
dij 0;
Observatia 4.3.6. Daca G = (V, E) este un graf neorientat si V = {1, . . . , n},
atunci pentru orice nod x V componenta conexa a nodului x este (indusa
de) multimea
{x} {y|y V \ {x}, dxy = 1}.
Astfel Algoritmul Roy-Warshall poate fi utilizat pentru determinarea componentelor conexe si pentru verificarea conexitatii grafului.
Algoritmul 4.3.2 (determinarea componentelor tare-conexe). Daca G =
(V, E) este un graf orientat si V = {1, . . . , n}, atunci pentru orice nod x V
componenta tare-conexa a nodului x este (indusa de) multimea
{x} {y|y V \ {x}, dxy = dyx = 1},
deci Algoritmul Roy-Warshall poate fi utilizat pentru determinarea componentelor tare-conexe si pentru verificarea tare-conexitatii grafului.
Descrierea n pseudocod a algoritmului are forma


TEMA 4. METODA PROGRAMARII
DINAMICE

103

COMPONENTE TARE CONEXE :


nrc 0;
// num
arul de componente tare-conexe
for i = 1, n do
CC[i] 0;
// vectorul componentelor tare-conexe
ROY WARSHALL;
for i = 1, n do
if (CC[i] = 0) then
nrc nrc + 1;
CC[i] nrc;
for j = i + 1, n do
if (CC[j] = 0) and (dij = 1) and (dji = 1) then
CC[j] nrc;
unde CC[i] reprezinta numarul componentei tare-conexe n care se afla nodul
i, i {1, . . . , n}.

4.4

Distante si drumuri minime. Algoritmul


Roy-Floyd

Vom expune un algoritm pentru determinarea distantelor minime si a drumurilor minime ntre orice doua noduri ale grafului ponderat dat. Acest
algoritm este asemanator cu Algoritmul Roy-Warshall pentru determinarea
matricei drumurilor.
Algoritmul 4.4.1 (Roy-Floyd). Fie (G, c) un graf ponderat, G = (V, E),
V = {v1 , v2 , . . . , vn }, c : E R+ . Fie C = (cij )i,j=1,n matricea distantelor
directe asociata grafului (G, c). Se calculeaza matricele
(k)

C (k) = (cij )i,j=1,n , k {0, 1, . . . , n}


definite prin
C (0) = C,
(k)
cij

(k1) (k1)
min{cij , cik

(4.4.1)
+

(k1)
ckj },

k, i, j {1, . . . , n}.

(4.4.2)

Teorema 4.4.1 (de corectitudine a Algoritmului Roy-Floyd). In contextul Algoritmului Roy-Floyd, ultima matrice calculata este chiar matricea
distantelor minime asociata grafului (G, c), adica
C (n) = C .


TEMA 4. METODA PROGRAMARII
DINAMICE

104

Demonstratie. Vom demonstra prin inductie dupa k {0, 1, . . . , n} ca pentru


orice i, j {1, . . . , n} avem

min{c()| = (vi , . . . , vj ), I() {v1 , . . . , vk }}, daca


(k)
cij =
= (vi , . . . , vj ) drum cu I() {v1 , . . . , vk },
(4.4.3)

, n caz contrar,

unde I() reprezinta multimea nodurilor intermediare ale drumului si


{v1 , . . . , vk } reprezinta multimea {vi |1 i k}, deci pentru k = 0 aceasta
multime este .
(0)
Pentru k = 0 avem cij = cij (conform (4.4.1)) si egalitatea (4.4.3) este
evidenta din definitia matricei C a costurilor directe si faptul ca I() =
nseamna ca drumul este de fapt un arc sau o muchie pentru i 6= j, respectiv
ca este o bucla sau drumul (vi ) de lungime 0 pentru i = j.
Presupunem acum egalitatea (4.4.3) adevarata pentru k 1 (1 k n)
si o demonstram pentru k. Fie d [0, ). Folosind (4.4.2), ipoteza de
inductie si principiul optimalitatii al lui Bellman avem echivalentele:
(k)

(k1)

cij = d cij

(k1)

= d cik

(k1)

+ ckj

(k1)

sau cik

(k1)

+ ckj

(k1)

= d < cij

= (vi , . . . , vj ) drum minim cu proprietatea ca I() {v1 , . . . , vk1 }


(adica de cost minim dintre toate drumurile de la vi la vj ce satisfac aceasta
proprietate), c() = d c(1 ) + c(2 ) 1 = (vi , . . . , vk ), 2 = (vk , . . . , vj )
drumuri cu I(1 ), I(2 ) {v1 , . . . , vk1)
sau
1 = (vi , . . . , vk ), 2 = (vk , . . . , vj ) drumuri minime cu proprietatea ca
I(1 ), I(2 ) {v1 , . . . , vk1 }, c(1 ) + c(2 ) = d < c(), = (vi , . . . , vj )
drum cu I() {v1 , . . . , vk1 }
= (vi , . . . , vj ) drum minim cu proprietatea ca
I() {v1 , . . . , vk }, vk 6 I(), c() = d
sau
= (vi , . . . , vk , . . . , vj ) drum minim cu proprietatea ca
I( ) {v1 , . . . , vk }, vk I( ), c() = d
( se obtine parcurgand ntai 1 , apoi 2 si, reciproc,
1 si 2 sunt portiunile din dintre vi si prima aparitie a lui vk n I( ),
respectiv dintre ultima aparitie a lui vk n I( ) si vj ; ntre aceste aparitii
eventualele arce sau muchii ale lui au costul 0 conform Observatiei 2.5.1)
= (vi , . . . , vj ) drum minim cu proprietatea ca
I() {v1 , . . . , vk }, c() = d.


TEMA 4. METODA PROGRAMARII
DINAMICE

105

Demonstratia prin inductie a egalitatii (4.4.3) este astfel ncheiata.


Pentru k = n conditia I() {v1 , . . . , vn } poate fi eliminata, fiind
(n)
ntotdeauna adevarata, deci din (4.4.3) si Definitia 2.5.2 obtinem cij =
cij , i, j {1, . . . , n}, adica egalitatea din enunt.
Observatia 4.4.1. Algoritmul Roy-Floyd are complexitatea (n3 ) (deoarece
necesita cate o adunare si o comparatie pentru fiecare triplet (k, i, j), cu
k, i, j {1, . . . , n}).
Exemplul 4.4.1. Pentru graful din Exemplul 2.5.1, prin aplicarea Algoritmului Roy-Floyd obtinem matricele:

0 15 10 5
0 15 10 5
0
0

(1)
(0)
; C = 5 0 5

5
0

5
C =C=

10 0 5
10 0 5
5 5 15 10 0
5 5 0
(deoarece, de exemplu,

0 15
0

C (2) =
5
10
5 5

0 15 10
0

C (4) =
5 0
10
5 5 15

(1)

(0)

(0)

(0)

c53 = min{c53 , c51 + c13 } = min{, 5 + 10} = 15);

0 15 10 5 15
10 5
0

(3)
;

5
0

5
0 5 ; C =

10 0 5
0 5
5 5 15 10 0
15 10 0

0 15 10 5 10
5 10
0

(5)
= C

10
5
0
15
5
5 ; C =

10 10 20 0 5
0 5
5 5 15 10 0
10 0

(matricea distantelor minime).


Observatia 4.4.2. Conform ecuatiilor (4.4.3), Algoritmul Roy-Floyd este un
algoritm specific metodei program
arii dinamice.
(k)
(k1)
(k)
(k1)
Conform ecuatiilor (4.4.2) avem cik = cik
si ckj = ckj , k, i, j
{1, . . . , n}, deci pentru implementarea algoritmului putem utiliza o singura
matrice C (k) . Astfel obtinem urmatoarea descriere n pseudocod a algoritmului.


TEMA 4. METODA PROGRAMARII
DINAMICE
ROY FLOYD :
for i = 1, n do
for j = 1, n do
cij cij ;

106

// init
ializ
ari

for k = 1, n do
for i = 1, n do
for j = 1, n do
if (cik + ckj < cij ) then
cij cik + ckj ;
Considerand ca functia cost c este strict pozitiva, pentru determinarea
tuturor drumurilor minime (elementare) dintre doua noduri distincte x, y
putem utiliza echivalenta:

z 6= x,
(x, z, . . . , y) = drum minim
cxz + czy = cxy ,
unde multimea nodurilor este multimea standard V = {1, . . . , n}.
Astfel putem determina toate nodurile z ce sunt succesori directi ai nodului x pe drumuri minime de la x la y, si continuand acest procedeu pentru
subdrumurile minime dintre z si y se gasesc toate drumurile minime elementare de la x la y.

Tema 5
Metoda Backtracking
5.1

Descrierea metodei. Algoritmi generali

Metoda Backtracking (metoda c


aut
arii cu revenire) se aplica problemelor a caror solutie se poate reprezenta sub forma unui vector
x = (x1 , x2 , . . . , xn ) S1 S2 Sn ,
unde:
S1 , S2 , . . . , Sn sunt multimi finite si nevide, elementele lor aflandu-se
ntr-o relatie de ordine bine stabilita;
ntre componentele x1 , x2 , . . . , xn ale vectorului x sunt precizate anumite relatii, numite conditii interne.
Observatia 5.1.1. Nu pentru toate problemele, numarul de componente n al
solutiilor este de la nceput cunoscut, acesta urmand a fi determinat.
Observatia 5.1.2. Pentru o aceeasi problema, numarul de componente al
solutiilor poate fi diferit.
Definitia 5.1.1. Multimea finita S = S1 S2 Sn se numeste spatiul
solutiilor posibile.
Un vector x = (x1 , . . . , xn ) S se numeste solutie posibil
a.
Solutiile posibile care satisfac conditiile interne se numesc solutii rezultat.
Observatia 5.1.3. Metoda Backtracking si propune sa determine:
fie o solutie rezultat,
fie toate solutiile rezultat.
107

TEMA 5. METODA BACKTRACKING

108

Obtinerea tuturor solutiilor rezultat poate constitui o etapa intermediara


n rezolvarea unei alte probleme, urmand ca, n continuare, dintre acestea sa
fie alese solutiile care optimizeaza (minimizeaza sau maximizeaza) o anumita
functie obiectiv data.
Observatia 5.1.4. O varianta de determinare a solutiilor rezultat ar putea fi
urmatoarea:
se genereaza succesiv toate solutiile posibile, adica toate elementele produsului cartezian S1 S2 Sn ;
pentru fiecare solutie posibila se verifica daca sunt satisfacute conditiile
interne;
se retin cele care satisfac aceste conditii.
Aceasta varianta are dezavantajul ca timpul de executie este foarte mare.
De exemplu, daca |Si | = 2, i = 1, n, atunci spatiul solutiilor posibile ar
avea 2n elemente, iar complexitatea ar fi de ordinul (2n ) (nesatisfacatoare!!).
Metoda Backtracking urmareste sa evite generarea tuturor solutiilor posibile,
ceea ce duce la scurtarea timpului de executie.
Definitia 5.1.2. Fie k {1, . . . , n}. Un set de relatii definite pentru componenta xk Sk prin intermediul unor eventuale componente ale vectorului
(x1 , . . . , xk1 ) S1 S2 Sk1 repreinta conditii de continuare
pentru xk mpreuna cu (x1 , . . . , xk1 ) daca:
1. aceste relatii sunt necesare pentru existenta unei solutii rezultat de
forma
(x1 , . . . , xk1 , xk , xk+1 , . . . , xn ),
adica nendeplinirea acestor conditii implica faptul ca oricum am alege
xk+1 Sk+1 , . . . , xn Sn vectorul x = (x1 , . . . , xn ) nu poate fi o solutie
rezultat (nu verifica conditiile interne);
2. pentru k = n conditiile de continuare coincid cu conditiile interne.
Orice vector (x1 , . . . , xk ) S1 S2 Sk , cu 1 k n, care satisface
conditiile de continuare, se numeste solutie partial
a.
Mecanismul metodei Backtracking:
Prin metoda Backtracking solutia se construieste pas cu pas (componenta
cu componenta) pe principiul stivei.

TEMA 5. METODA BACKTRACKING

109

La fiecare nivel k, se caut


a un element din multimea de nivel Sk ,
care s
a fie atribuit componentei xk
si care mpreun
a cu (x1 , . . . , xk1 ) s
a verifice conditiile de continuare

Mai precis, avem urmatorii pasi:


1. Se ncepe cu solutia partiala data de vectorul x vid.
2. Se ia primul element din multimea S1 si se atribuie lui x1 .
3. Presupunand generate elementele (x1 , x2 , . . . , xk1 ), xi Si , i = 1, k 1,
se avanseaz
a la nivelul k si se cauta primul element disponibil din Sk
a carui valoare sa fie atribuita lui xk .
Avem urmatoarele cazuri:
3.1. A fost gasit n Sk un element disponibil. Atunci:
l atribuim lui xk ;
se verifica daca acesta mpreuna cu elementele deja generate
x1 , . . . , xk1 ndeplineste conditiile de continuare.
Avem urmatoarele subcazuri:
3.1.1. xk verifica conditiile de continuare. Atunci:
se extinde solutia partiala la (x1 , . . . , xk1 , xk );
se verifica daca k = n:
3.1.1.1. Daca da, atunci s-a obtinut o solutie rezultat.
Acum, fie ne oprim, fie continuam cu cautarea altei solutii
rezultat, reluand algoritmul (cu pasul 3.), considerand generate (x1 , . . . , xk1 ) si cautand n continuare pentru xk
un element netestat din Sk .
3.1.1.2. Daca nu (k < n), se reia algoritmul cu pasul 3.,
cautand extinderea solutiei partiale (x1 , . . . , xk1 , xk ) cu
testarea primului element din Sk+1 (se avanseaz
a).

TEMA 5. METODA BACKTRACKING

110

3.1.2. xk nu verifica conditiile de continuare. Atunci, oricum am


alege urmatoarele componente pentru x (adica pe xk+1 , . . . , xn ),
nu vom obtine o solutie rezultat. Prin urmare, se va relua algoritmul (cu pasul 3.), avand generate x1 , . . . , xk1 si cautand
extinderea solutiei cu urmatorul element netestat din Sk (continua c
autarea).
3.2. Nu a fost gasit n Sk un element disponibil (netestat). Atunci se
considera generate x1 , . . . , xk2 (se revine) si se reia c
autarea cu
urmatorul element din Sk1 netestat, pentru extinderea solutiei
partiale (x1 , . . . , xk2 ) (pas 3.).
Observatia 5.1.5. Algoritmul se termina atunci cand nu mai exista nici un
element din S1 netestat.
Observatia 5.1.6. Dupa avansare, c
autarea se va face ncepand cu testarea
primului element din multimea de nivel Sk corespunzatoare.
Observatia 5.1.7. Dupa revenire, c
autarea se va face ncepand cu urmatorul
element netestat (la etapele anterioare) din multimea de nivel Sk corespunzatoare.
Observatia 5.1.8. Conditiile de continuare sunt necesare pentru existenta
unei solutii rezultat, iar ideal este ca ele sa fie si suficiente, ceea ce, de obicei,
este imposibil!
Alegerea acestor conditii este esentiala n utilizarea metodei Bactracking,
deoarece cu cat conditiile de continuare sunt mai restrictive, cu atat se limiteaza mai mult numarul de cautari (n consecinta si numarul de avansari si
reveniri), deci metoda este mai eficienta.
De obicei conditiile de continuare sunt restrictiile conditiilor interne la
primele k omponente.
Observatia 5.1.9. In general, problemele rezolvate cu Backtracking necesita
un timp foarte mare de executie. De aceea, metoda se utilizeaza atunci cand
nu avem la dispozitie un algoritm mai eficient. Problemele tipice care se pot
rezolva utilizand aceasta metoda sunt cele nedeterminist-polinomial complete
(NP -complete).
Consideram cazul particular n care multimile Sk , k = 1, n, contin
termeni succesivi ai unor progresii aritmetice. Pentru fiecare k, k = 1, n,
multimea Sk va fi data de:
ak primul termen al progresiei;
rk > 0 ratia progresiei;
bk ultimul termen al progresiei,

TEMA 5. METODA BACKTRACKING

111

adica
Sk = {ak , ak + rk , ak + 2rk , . . . , bk }, k = 1, n.
Pentru acest caz particular, vom prezrnta n continuare sase variante pentru schema Backtracking: si anume doua variante iterative si patru variante
recursive.
Algoritmul 5.1.1 (Schema Backtracking iterativ
a, varianta 1).
BACKTRACKING :
k 1;
x[1] a[1] r[1];// preg
atim introducerea valorii init
iale a1
// pentru x1
while k > 0 do
if x[k] < b[k] then
// mai exist
a valori netestate pentru xk
x[k]

x[k]
+
r[k];
autare

 // C
if (x[1], . . . , x[k]) verifica conditiile de continuare then
if k = n then
// (x[1], . . . , x[n]) este solut
ie rezultat

PRELUCREAZA(x[1],
. . . , x[n]);
(*)
// STOP, dac
a se dore
ste
// o singur
a solut
ie rezultat
else
k k + 1;
// Avansare
x[k] a[k] r[k];
// preg
atim introducerea
// valorii init
iale ak pentru xk
else
// nu mai exist
a valori netestate pentru xk
k k 1;
// Revenire
Urmatoarea schema este echivalenta cu cea de mai sus.
Algoritmul 5.1.2 (Schema Backtracking iterativ
a, varianta 2).

TEMA 5. METODA BACKTRACKING

112

BACKTRACKING2 :
k 1;
x[1] a[1] r[1];// preg
atim introducerea valorii init
iale a1
// pentru x1
while k > 0 do
if k n then
if x[k] < b[k] then
// mai exist
a valori netestate pentru xk
x[k]

x[k]
+
r[k];
// C
autare

if (x[1], . . . , x[k]) verifica conditiile de continuare then
k k + 1;
// Avansare
x[k] a[k] r[k];
// preg
atim introducerea
// valorii init
iale ak pentru xk
else
k k 1;

// Revenire

else

// (x[1], . . . , x[n]) este solut


ie rezultat

PRELUCREAZA(x[1],
. . . , x[n]);
(*)
// STOP, dac
a se dore
ste
// o singur
a solut
ie rezultat
k k 1;
// Revenire, dac
a se doresc
// toate solut
iile rezultat
Observatia 5.1.10. Schemele Backtracking de mai sus genereaza toate solutiile
problemei date. Daca se doreste obtinerea unei singure solutii, atunci, n loc
de () se poate insera o comanda de oprire (STOP) sau, la unele probleme,
se poate forta revenirea.
Algoritmul 5.1.3 (Schema Backtracking recursiv
a, varianta 1).

TEMA 5. METODA BACKTRACKING

113

BACKR1(k) :
// se genereaz
a (x[k], . . . , x[n])
x[k] a[k] r[k];// preg
atim introducerea valorii init
iale ak
// pentru xk
while x[k] < b[k] do
x[k]
// C
autare
 x[k] + r[k];

if (x[1], . . . , x[k]) verifica conditiile de continuare then
if k = n then
// (x[1], . . . , x[n]) este solut
ie rezultat

PRELUCREAZA(x[1],
. . . , x[n]);
else
BACKR1(k + 1);
// Avansare, adic
a
// se genereaz
a, RECURSIV, (x[k + 1], . . . , x[n]).
// La ^
ncheierea apelului BACKR1(k + 1) se produce
// revinirea la funct
ia BACKR1(k)
Apelare: BACKR1(1).
Urmatoarea schema este echivalenta cu cea de mai sus.
Algoritmul 5.1.4 (Schema Backtracking recursiv
a, varianta 2).
BACKR2(k) :
if k n then
x[k] a[k] r[k];
while x[k] < b[k] do
x[k]
 x[k] + r[k];

if (x[1], . . . , x[k]) verifica conditiile de continuare then
BACKR2(k + 1);
else

PRELUCREAZA(x[1],
. . . , x[n]);
Apelare: BACKR2(1).
Algoritmul 5.1.5 (Schema Backtracking recursiv
a, varianta 3).

TEMA 5. METODA BACKTRACKING

114

BACKR3(k) :
for v = a[k], b[k], r[k] do
// C
autarea lui xk ^
n mult
imea Sk
x[k]
 v;

if (x[1], . . . , x[k]) verifica conditiile de continuare then
if k = n then
// (x[1], . . . , x[n]) este solut
ie rezultat

PRELUCREAZA(x[1],
. . . , x[n]);
else
BACKR3(k + 1);
// Avansare, adic
a
// se genereaz
a, RECURSIV, (x[k + 1], . . . , x[n]).
// La ^
ncheierea apelului BACKR1(k + 1) se produce
// revinirea la funct
ia BACKR1(k)
Apelare: BACKR3(1).
Urmatoarea schema este echivalenta cu cea de mai sus.
Algoritmul 5.1.6 (Schema Backtracking recursiv
a, varianta 4).
BACKR4(k) :
if k n then
for v = a[k], b[k], r[k] do
x[k]
 v;

if (x[1], . . . , x[k]) verifica conditiile de continuare then
BACKR4(k + 1);
else

PRELUCREAZA(x[1],
. . . , x[n]);
Apelare: BACKR4(1).
Observatia 5.1.11. Schemele Backtracking din Algoritmii 5.1.1, 5.1.2, 5.1.3 si
5.1.4 pot fi usor adaptate si pentru situati n care elementele fiecarei multimi
Sk nu sunt n progresie aritmetica.
Observatia 5.1.12. Daca n oricare din cele sase scheme de mai sus se renunta
la testul
[(x[1], x[2], . . . , x[k]) verifica conditiile de continuare],
considerandu-se astfel ca orice solutie partiala este valida (verifica conditiile
interne), atunci se vor obtine ca solutii ale problemei toate elementele produsului cartezian S1 S2 Sn .

TEMA 5. METODA BACKTRACKING

5.2

115

Problema celor n dame

Fiind data o tabla de sah de dimensiune n n, n 4, se cer toate solutiile


de aranjare a n dame astfel ncat oricare doua dame sa nu se atace reciproc
(pe linii, coloane sau diagonale).
Rezolvare.
In orice orice solutie rezultat, pe fiecare linie a tablei se afla exact o dama.
Rezulta ca o solutie pentru problema celor n dame se poate reprezenta
sub forma unui vector
x = (x1 , x2 , . . . , xn ),
unde xi va reprezenta coloana pe care se afla dama de pe linia i, pentru
i = 1, n.
Exemplu: n = 5

1
2
3
4
5

1 2 3 4 5

O solutie rezultat este


x = (1, 3, 5, 2, 4),
iar urmatoarea generata este x = (1, 4, 2, 5, 3).
Pentru cazul general, avem
x = (x1 , x2 , . . . , xn ) S1 S2 Sn ,
unde
S1 = S2 = = Sn = {1, 2, . . . , n}.

Asadar, multimile Sk , contin termeni succesivi ai unei progresii aritmetice, n care

ak = 1,
rk = 1, k = 1, n.

bk = n,
Conditiile interne:

116

TEMA 5. METODA BACKTRACKING

Doua dame de pe liniile i si j (i 6= j) nu se pot afla pe o aceeasi coloana:


xi 6= xj , i 6= j, i, j = 1, n;

Doua dame de pe liniile i si j (i 6= j) nu se pot afla pe o aceeasi


diagonala:
|ij| =
6 | xi xj |, i 6= j, i, j = 1, n
sau, echivalent,

j i 6= | xi xj |, 1 i < j n.
Conditiile de continuare:
Daca avem solutia partiala x = (x1 , . . . , xk1 ), atunci xk verific
a conditiile
de continuare daca
xk 6= xi si k i 6= | xk xi |, i = 1, k 1.

Altfel spus, daca avem solutia partiala x = (x1 , . . . , xk1 ), atunci xk nu


verifica conditiile de continuare daca
i, 1 i < k, astfel ncat xk = xi sau k i = | xk xi |.
DAME :
k 1;
x[1] 0;
while k > 0 do
if x[k] < n then
x[k] x[k] + 1;
if VALID(x, k) then
if k = n then
AFISARE(x);
else
k k + 1;
x[k] 0;
else
k k 1;
VALID(x, k) :
for i = 1, k 1 do
if (x[k] = x[i] or k i = | x[k] x[i] |) then
returneaz
a 0;
returneaz
a 1;


// fals
// adev
arat

TEMA 5. METODA BACKTRACKING

5.3

117

Colorarea grafurilor

Se da un graf neorientat G = (V, E), cu multimea nodurilor


V = {1, 2, . . . , n},
si un numar de m culori, numerotate cu 1, 2, . . . , m.
Se cere sa se determine toate modalitatile de colorare ale nodurilor grafului, utilizand cele m culori, astfel ncat oricare doua noduri adiacente sa fie
colorate cu culori diferite.
Rezolvare. O solutie se poate scrie sub forma
x = (x1 , x2 , . . . , xn ),
unde xi este culoarea atasata varfului i, xi {1, 2, . . . , m}.
Conditiile interne:
Orice doua noduri adiacente sunt colorate diferit, adica
(i, j) E, xi 6= xj .
Conditiile de continuare:
Daca x1 , . . . , xk1 sunt deja alese, atunci xk verifica conditiile de continuare,
daca
xi 6= xk , i {1, . . . , k 1} cu [i, k] E.
Altfel spus, xk nu verifica conditiile de continuare (nu este bun), daca
exista i {1, 2, . . . , k 1} astfel ncat [i, k] E si xi = xk .

Pentru reprezentarea grafului se foloseste matricea de adiacenta


A = (aij )i,j=1,n .
Graful fiind neorientat, matricea de adiacenta este simetrica.

TEMA 5. METODA BACKTRACKING

118

COLORARE(A, n, m) :
k 1;
x[1] 0;
while k > 0 do
if x[k] < m then
x[k] x[k] + 1;
if VALID(x, k) then
if k = n then
AFISARE(x);
else
k k + 1;
x[k] 0
;
else
k k 1;
VALID(x, k) :
for i = 1, k 1 do
if (aik 1 and x[i] = x[k]) then
returneaz
a 0;
returneaz
a 1;


Aplicatie a problemei color


arii grafurilor: colorarea
h
artilor
Data fiind o harta, se cere colorarea fiecarei tari cu o culoare, astfel ncat
orice doua tari avand frontiera comuna sa fie colorate diferit.
Unei probleme de colorare a unei harti i se poate asocia un graf neorientat
astfel:
fiecarei tari i corespunde un nod
ntre doua noduri exista muchie daca si numai daca ele corespund unor
tari cu frontiera comuna.
Exemplul 5.3.1.

119

TEMA 5. METODA BACKTRACKING

2
1

1
5

3
5

Astfel problema colorarii unei harti se reduce la problema colorarii grafului asociat.
Observatia 5.3.1. Graful asociat unei harti este planar, adica exista o reprezentare grafica n plan a acestuia astfel ncat muchiile sa nu se intersecteze
decat n noduri.
Observatia 5.3.2. Celebritatea problemei colorarii hartilor a constat n faptul
ca n toate exemplele ntalnite, colorarea s-a putut face cu numai 4 culori,
dar teoretic se demonstrase ca sunt suficiente 5 culori.
Problema a aparut n 1852, cand un matematician amator, Fracis
Guthrie, a ncercat sa coloreze harta comitatelor britanice, folosind
numai 4 culori.
In anul 1976, Wolfgang Haken si Kenneth Appel, de la Universitatea
Illinois (SUA), au demonstrat ca pentru colorare sunt suficiente 4 culori.
Demonstratia problemei s-a efectuat cu ajutorul calculatorului electronic, analizandu-se 1482 configuratii n circa 1200 ore calculator.
Teorema 5.3.1 (Teorema celor 4 culori). Pentru colorarea unui graf
planar sunt suficiente patru culori.

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