Sunteți pe pagina 1din 82

ALGORITMICA GRAFURILOR

Conf. univ. dr. COSTEL BĂLCĂU

2022
Tematica

1 Aranjamente, combinări, permutări 6


1.1 Preliminarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Produs cartezian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Submult, imi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Aranjamente cu repetit, ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Aranjamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6 Permutări . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.7 Combinări . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.8 Combinări cu repetit, ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.9 Permutări cu repetit, ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2 Partit, ii 18
2.1 Compuneri ale unui număr natural . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Partit, ii ale unui număr natural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Partit, ii ale unei mult, imi finite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3 Grafuri 25
3.1 Definit, ii generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Reprezentarea (memorarea) grafurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3 Grade, secvent, e grafice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4 Conexitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5 Parcurgerea grafurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.6 Algoritmul Roy-Warshall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

4 Arbori s, i arborescent, e 53
4.1 Numărul ciclomatic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2 Teorema de caracterizare a arborilor . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.3 Teorema de caracterizare a arborescent, elor . . . . . . . . . . . . . . . . . . . . . . . . 59
4.4 Numărarea arborilor part, iali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.5 Numărarea arborescent, elor part, iale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

5 Arbori part, iali de cost minim 66


5.1 Expunerea problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.2 Algoritmii lui Kruskal s, i Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

6 Grafuri euleriene 74

7 Grafuri hamiltoniene 75

1
TEMATICA 2

8 Grafuri turneu 76

9 Colorări ı̂n grafuri 77

10 Grafuri bipartite 78

11 Grafuri planare 79

12 Distant, e s, i drumuri minime ı̂n grafuri ponderate 80

13 Fluxuri ı̂n ret, ele de transport 81


Evaluare

• Activitate laborator: 30% (Programe obligatorii, programe suplimentare s, i probleme din Temele
de laborator)

• Teme de casă: 20% (Programe suplimentare s, i probleme nerezolvate ı̂n timpul laboratorului,
din Temele de laborator)

• Examen final: 50% (Probă scrisă: algoritmi s, i probleme)

3
Bibliografie

[1] A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, Addison-Wesley, Massachusetts, 2009.

[2] Gh. Barbu, V. Păun, Calculatoare personale s, i programare ı̂n C/C++, Editura Didactică s, i Pedagogică,
Bucures, ti, 2005.

[3] Gh. Barbu, V. Păun, Programarea ı̂n limbajul C/C++, Editura Matrix Rom, Bucures, ti, 2011.

[4] Gh. Barbu, I. Văduva, M. Bolos, teanu, Bazele informaticii, Editura Tehnică, Bucures, ti, 1997.

[5] C. Bălcău, Combinatorică s, i teoria grafurilor, Editura Universităt, ii din Pites, ti, Pites, ti, 2007.

[6] O. Bâscă, L. Livovschi, Algoritmi euristici, Editura Universităt, ii din Bucures, ti, Bucures, ti, 2003.

[7] E. Ciurea, Algoritmi. Introducere ı̂n algoritmica grafurilor, Editura Tehnică, Bucures, ti, 2001.

[8] E. Ciurea, L. Ciupală, Algoritmi. Introducere ı̂n algoritmica fluxurilor ı̂n ret, ele, Editura Matrix Rom, Bucures, ti,
2006.

[9] I. Codreanu, M. Lascu, Probleme de combinatorică, Editura Gil, Zalău, 2016.

[10] T.H. Cormen, Algorithms Unlocked, MIT Press, Cambridge, 2013.

[11] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduction to Algorithms, MIT Press, Cambridge, 2009.

[12] C. Croitoru, Tehnici de bază ı̂n optimizarea combinatorie, Editura Universităt, ii ”Al. I. Cuza”, Ias, i, 1992.

[13] S. Even, Graph Algorithms, Cambridge University Press, 2012.

[14] D. Fanache, Teoria algoritmică a grafurilor, Editura Paralela 45, Pites, ti, 2016.

[15] H. Georgescu, Tehnici de programare, Editura Universităt, ii din Bucures, ti, Bucures, ti, 2005.

[16] C.A. Giumale, Introducere ı̂n analiza algoritmilor. Teorie s, i aplicat, ii, Editura Polirom, Ias, i, 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, 2013.

[19] M. Keller, W. Trotter, Applied Combinatorics, Open Textbook Library, 2017.

[20] D.E. Knuth, The Art Of Computer Programming. Vol. 4A: Combinatorial Algorithms, Addison-Wesley, Mas-
sachusetts, 2011.

[21] B. Korte, J. Vygen, Combinatorial Optimization.Theory and Algorithms, Springer, 2012.

[22] L. Livovschi, H. Georgescu, Sinteza s, i analiza algoritmilor, Editura S, tiint, ifică s, i Enciclopedică, Bucures, ti, 1986.

[23] D. Logofătu, Algoritmi fundamentali ı̂n Java: Aplicat, ii, Editura Polirom, Ias, i, 2007.

[24] D. Lucanu, M. Craus, Proiectarea algoritmilor, Editura Polirom, Ias, i, 2008.

4
5

[25] L. Panaitopol, A. Szilard, D. S, erbănescu, Probleme de combinatorică pentru juniori, Editura Gil, Zalău, 2019.

[26] V. Pop, L. Popa, D. Popa, M. Olteanu, G. Mincu, M. Burlică, R. Strungariu, M. Ispas, Teme s, i probleme pentru
concursurile student, es, ti de matematică. Volumul II. Concursuri internat, ionale, Editura StudIS, Ias, i, 2013.

[27] V. Pop, M. Teleucă, Probleme de combinatorică elementară. Numărare, grafuri, jocuri, Editura Matrix Rom,
Bucures, ti, 2013.

[28] D.R. Popescu, Combinatorică s, i teoria grafurilor, Societatea de S, tiint, e Matematice din România, Bucures, ti,
2005.

[29] D.R. Popescu, R. Marinescu-Ghemeci, Combinatorică s, i teoria grafurilor prin exercit, ii s, i probleme, Editura
Matrix Rom, Bucures, ti, 2014.

[30] C.P. Popovici, H. Georgescu, L. State, Bazele informaticii. Vol. I s, i II, Editura Universităt, ii din Bucures, ti,
Bucures, ti, 1990-1991.

[31] S.S. Ray, Graph Theory with Algorithms and its Applications, Springer, New Delhi, 2013.

[32] O.A. Schipor, S.G. Pentiuc, F. Gı̂ză-Belciug, Limbajul C - Tehnici de programare eficientă, Editura Matrix Rom,
Bucures, ti, 2014.

[33] R. Sedgewick, K. Wayne, Algorithms, Addison-Wesley, Massachusetts, 2011.

[34] N.O. Stănăs, ilă s, .a., Teme s, i probleme pentru concursurile student, es, ti de matematică. Volumul III. Concursuri
nat, ionale, Editura StudIS, Ias, i, 2013.

[35] R. Stephens, Essential Algorithms: A Practical Approach to Computer Algorithms, Wiley, Indianopolis, 2013.

[36] T. Toadere, Grafe. Teorie, algoritmi s, i aplicat, ii, Editura Albastră, Cluj-Napoca, 2002.

[37] I. Tomescu, Combinatorică s, i teoria grafurilor, Tipografia Universităt, ii din Bucures, ti, Bucures, ti, 1978.

[38] I. Tomescu, Probleme de combinatorică s, i teoria grafurilor, Editura Didactică s, i Pedagogică, Bucures, ti, 1981.

[39] I. Tomescu, Data structures, Editura Universităt, ii din Bucures, ti, Bucures, ti, 2004.

[40] ***, Handbook of combinatorics, edited by R.L. Graham, M. Grőtschel and L. Lovász, Elsevier, Amsterdam,
1995.

[41] ***, 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.

[42] ***, Revista MATINF. Publicat, ie bianuală de matematică s, i informatică pentru elevi s, i profesori, editată de
Departamentul Matematică-Informatică, Universitatea din Pites, ti, Editura Universităt, ii din Pites, ti.
Tema 1

Aranjamente, combinări, permutări

1.1 Preliminarii
În această lect, ie vom prezenta formule de numărare s, i algoritmi de generare (enumerare) pentru
cele mai cunoscute familii de obiecte combinatoriale: produs cartezian, submult, imi, aranjamente
(fără repetit, ie, cu repetit, ie sau ordonate), combinări (fără repetit, ie sau cu repetit, ie), permutări (fără
repetit, ie sau cu repetit, ie). Reamintim ı̂n continuare câteva not, iuni uzuale.
Definit, ia 1.1.1. Fie A o mult, ime finită. Numărul de elemente ale lui A, notat cu card (A), se
numes, te cardinalul mult, imii A.
Definit, ia 1.1.2. Fie A un alfabet (adică o mult, ime finită) s, i n ∈ N⋆ . O secvent, ă de forma
a = a1 a2 . . . an , cu a1 , a2 , . . . , an ∈ A,
se numes, te cuvânt de lungime n peste alfabetul A. Lungimea cuvântului a se notează cu |a|.
Observat, ia 1.1.1. Evident, cuvântul a1 a2 . . . an poate fi identificat cu vectorul (a1 , a2 , . . . , an ).
Definit, ia 1.1.3. Fie A o mult, ime (alfabet) total ordonată s, i x = (x1 , . . . , xn ), y = (y1 , . . . , ym )
doi vectori (cuvinte) cu elemente (litere) din A. Spunem că x este mai mic decât y ı̂n ordine
lexicografică s, i notăm x ≺ y dacă
(x1 , . . . , xn ) = (y1 , . . . , yn ) s, i m > n
sau dacă există un indice i, i ≤ min{m, n}, astfel ı̂ncât
(x1 , . . . , xi−1 ) = (y1 , . . . , yi−1) s, i xi < yi .
Exemplul 1.1.1. Considerând alfabetul A = {a, b, c, . . . , z} s, i ordinea alfabetică uzuală a < b < c <
· · · < z, avem
ion ≺ ionela ≺ ionescu.
Definit, ia 1.1.4. Fie x ∈ R s, i n ∈ N. Notăm
 
 1, dacă n = 0,  1, dacă n = 0,
[x]n = x(x − 1) . . . (x − n + 1), dacă n ≥ 1, [x]n = x(x + 1) . . . (x + n − 1), dacă n ≥ 1.
 | {z }  | {z }
n factori n factori

[x]n se numes, te polinomul factorial descrescător de gradul n, iar [x]n se numes, te polinomul
factorial crescător de gradul n.
Exemplul 1.1.2. Avem [1,5]3 = 1,5 · 0,5 · (−0,5) = −0,375, iar [1,5]3 = 1,5 · 2,5 · 3,5 = 13,125.

6
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 7

1.2 Produs cartezian


Definit, ia 1.2.1. Produsul cartezian al mult, imilor A1 , A2 , . . . , An (n ∈ N⋆ ) este mult, imea

A1 × A2 × . . . × An = {(a1 , a2 , . . . , an )|a1 ∈ A1 , a2 ∈ A2 , . . . , an ∈ An }.

Exemplul 1.2.1. {a, b} × {+, −} × {c} = {(a, +, c), (a, −, c), (b, +, c), (b, −, c)}.

Propozit, ia 1.2.1 (de numărare a produsului cartezian). Fie n ∈ N⋆ s, i A1 , A2 , . . . , An mult, imi


finite. Atunci card (A1 × A2 × . . . × An ) = card (A1 ) · card (A2 ) · . . . · card (An ).

Demonstrat, ie. Se utilizează metoda induct, iei matematice după n.


Algoritmul 1.2.1 (de generare a produsului cartezian). Fie mult, imile standard

A1 = {1, 2, . . . , m1 }, A2 = {1, 2, . . . , m2 }, . . . , An = {1, 2, . . . , mn }.

Vom utiliza ”regula următorului”.

• Primul element al produsului cartezian A1 × A2 × . . . × An , ı̂n ordine lexicografică, este

(c1 , c2 , . . . , cn ) = (1, 1, . . . , 1).

• Un element arbitrar (curent)

(c1 , . . . , ck−1, ck , ck+1 , . . . , cn )

are un element următor dacă s, i numai dacă există un indice k ∈ {n, . . . , 1} astfel ı̂ncât ck < mk .
În acest caz, luând cel mai mare indice k cu această proprietate, elementul următor, ı̂n ordine
lexicografică, este
(c1 , . . . , ck−1, ck + 1, 1, . . . , 1).
În pseudocod, algoritmul poate fi descris sub forma
PRODUS CARTEZIAN(n, m) :
for i = 1, n do c[i] ← 1;
AFISARE(c, n);
repeat
k ← n;
while (c[k] = m[k]) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← 1;
AFISARE(c, n);
while (k > 0);
unde funct, ia de afis, are este
AFISARE(c, n) :
for i = 1, n do
afis, ează c[i];
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 8

Observat, ia 1.2.1. Pentru generarea produsului cartezian A1 × A2 × . . . × An al unor mult, imi finite
arbitrare

A1 = {a11 , a12 , . . . , a1m1 }, A2 = {a21 , a22 , . . . , a2m2 }, . . . , An = {an1 , an2 , . . . , anmn }

se poate folosi algoritmul anterior, bazat pe generarea indicilor, ı̂nlocuind afis, area indicilor ci cu
afis, area elementelor corespunzătoare aici din mult, imile Ai , adică ı̂nlocuind funct, ia AFIS, ARE(c, n)
cu funct, ia
AFISARE(c, a, n) :
for i = 1, n do
afis, ează a[i, c[i]];

1.3 Submult, imi


Propozit, ia 1.3.1 (de numărare a submult, imilor). Fie A o mult, ime finită s, i P(A) mult, imea
tuturor submult, imilor (părt, ilor) lui A. Atunci card (P(A)) = 2card (A) .
Demonstrat, ie. Fie A = {a1 , a2 , . . . , an }, n ∈ N⋆ . Notăm {1, 2}n = {1, 2} × . . . × {1, 2}.
| {z }
de n ori
Definim funct, iile α : P(A) → {1, 2}n s, i β : {1, 2}n → P(A) prin:

1, dacă ai ∈ B,
• ∀B ∈ P(A), α(B) = (c1 , c2 , . . . , cn ), unde ci =
2, dacă ai 6∈ B;

• ∀ (c1 , c2 , . . . , cn ) ∈ {1, 2}n , β(c1 , c2 , . . . , cn ) = {ai |ci = 1, i ∈ {1, . . . , n}}.


Funct, iile α s, i β sunt inverse una celeilalte, deci sunt bijective s, i card (P(A)) = card ({1, 2}n) = 2n .
Exemplul 1.3.1. Pentru A = {a, b, c}, corespondent, a submult, imi ↔ produs cartezian din demonstrat, ia
anterioară este redată ı̂n următorul tabel:
(c1 , c2 , c3 ) ∈ {1, 2}3 B ∈ P(A)
(1,1,1) {a, b, c}
(1,1,2) {a, b}
(1,2,1) {a, c}
(1,2,2) {a}
(2,1,1) {b, c}
(2,1,2) {b}
(2,2,1) {c}
(2,2,2) ∅

Deci A are 23 = 8 submult, imi.


Algoritmul 1.3.1 (de generare a submult, imilor). Fie mult, imea A = {a1 , a2 , . . . , an }. Conform
demonstrat, iei anterioare, putem genera produsul cartezian {1, 2}n cu Algoritmul 1.2.1 ı̂nlocuind
afis, area elementelor (c1 , . . . , cn ) cu afis, area submult, imilor corespunzătoare

B = {ai |ci = 1, i ∈ {1, . . . , n}}.

Obt, inem următorul algoritm descris ı̂n pseudocod.


TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 9

SUBMULT, IMI(a, n) :
for i = 1, n do c[i] ← 1;
AFISARE(c, a, n);
repeat
k ← n;
while (c[k] = 2) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← 2;
for i = k + 1, n do c[i] ← 1;
AFISARE(c, a, n);
while (k > 0);
unde funct, ia de afis, are este
AFISARE(c, a, n) :
for i = 1, n do
if c[i] = 1 then afis, ează a[i];

1.4 Aranjamente cu repetit, ie


Propozit, ia 1.4.1 (de numărare a aranjamentelor cu repetit, ie). Fie m, n ∈ N. Atunci numărul
de cuvinte de lungime n peste un alfabet cu m litere este egal cu mn .
Demonstrat, ie. Fie B = {1, 2, . . . , m} s, i C = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i}. Cum C = B n , conform
Propozit, iei 1.2.1 avem card (C) = mn .
Definit, ia 1.4.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc aranjamente cu repetit, ie
de m luate câte n. Prin abuz de limbaj, s, i numărul lor, adică mn , se numes, te tot aranjamente cu
repetit, ie de m luate câte n.
Exemplul 1.4.1. Pentru m = 2 s, i n = 3, aranjamente cu repetit, ie sunt, ı̂n ordine lexicografică:

(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2).

Deci avem 23 = 8 aranjamente cu repetit, ie.


Algoritmul 1.4.1 (de generare a aranjamentelor cu repetit, ie, sub formă de cuvinte). Pentru
mult, imea standard B = {1, 2, . . . , m}, conform demonstrat, iei anterioare putem genera produsul
cartezian B n , cu Algoritmul 1.2.1, luând m1 = m2 = · · · = mn = m.
Observat, ia 1.4.1. Pentru o mult, ime A = {a1 , a2 , . . . , am } oarecare putem genera indicii (c1 , . . . , cn )
cu algoritmul anterior s, i afis, a elementele corespunzătoare acestor indici (ac1 , . . . , acn ).

1.5 Aranjamente
Propozit, ia 1.5.1 (de numărare a aranjamentelor). Fie m, n ∈ N. Atunci numărul de cuvinte
de lungime n cu litere distincte peste un alfabet cu m litere este egal cu [m]n .
Demonstrat, ie. Fie B = {1, 2, . . . , m} s, i C1 = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i, ci 6= cj ∀ i 6= j}. Avem
C1 = {(c1 , c2 , . . . , cn )|c1 ∈ {1, . . . , m}, c2 ∈ {1, . . . , m} \ {c1 }, c3 ∈ {1, . . . , m} \ {c1 , c2 }, . . . , cn ∈
{1, . . . , m} \ {c1 , . . . , cn−1 }}, deci card (C1 ) = m(m − 1)(m − 2) . . . (m − n + 1) = [m]n .
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 10

Definit, ia 1.5.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc aranjamente (fără repetit, ie)
de m luate câte n. De asemenea s, i numărul lor, adică [m]n , se numes, te tot aranjamente (fără
repetit, ie) de m luate câte n s, i se mai notează cu Anm .
Observat, ia 1.5.1. Pentru n > m avem [m]n = m . . . (m − m) . . . (m − n + 1) = 0.
Exemplul 1.5.1. Pentru m = 4 s, i n = 2, aranjamentele sunt, ı̂n ordine lexicografică:
(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3).
Deci avem [4]2 = 4 · 3 = 12 aranjamente.
Un algoritm pentru generarea aranjamentelor va fi prezentat ı̂n Sect, iunea 1.7.

1.6 Permutări
Propozit, ia 1.6.1 (de numărare a permutărilor). Fie n ∈ N. Atunci numărul de cuvinte ce
cont, in exact o dată fiecare literă a unui alfabet cu n litere este egal cu n!, unde
n! = 1 · 2 · 3 · · · · · n (n factorial), 0! = 1.
Demonstrat, ie. Luăm m = n ı̂n Propozit, ia 1.5.1 s, i folosim egalitatea [n]n = n(n − 1) . . . 1 = n!.
Definit, ia 1.6.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc permutări (fără repetit, ie)
de ordinul n. De asemenea s, i numărul lor, adică n!, se numes, te tot permutări (fără repetit, ie)
de n.
Exemplul 1.6.1. Pentru n = 3, permutările mult, imii standard {1, 2, 3} sunt, ı̂n ordine lexicografică:
(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1).
Deci avem 3! = 1 · 2 · 3 = 6 permutări.
Algoritmul 1.6.1 (de generare a permutărilor). Fie mult, imea standard A = {1, 2, . . . , n}. Vom
utiliza din nou ”regula următorului”.
• Prima permutare, ı̂n ordine lexicografică, este
(p1 , p2 , . . . , pn ) = (1, 2, . . . , n).

• O permutare arbitrară (curentă)


(p1 , p2 , . . . , pk−1 , pk , pk+1, . . . , pn )
are o permutare următoare dacă s, i numai dacă există un indice k ∈ {n − 1, . . . , 1} astfel ı̂ncât
pk < pk+1. În acest caz, luând cel mai mare indice k cu această proprietate s, i cel mai mare indice
j din {n, . . . , k + 1} astfel ı̂ncât pj > pk (există, deoarece pk+1 > pk ), permutarea următoare,
ı̂n ordine lexicografică, este
(p1 , p2 , . . . , pk−1, pj , p′k+1 , . . . , p′j , . . . , p′n ),
unde vectorul (p′k+1, . . . , p′j , . . . , p′n ) este obt, inut prin ordonarea crescătoare a elementelor rămase
(pk , pk+1 , . . . , pj−1, pj+1, . . . , pn ). Cum aceste elemente formează vectorul ordonat descrescător
(pk+1 , . . . , pj−1 , pk , pj+1, . . . , pn ),
rezultă că vectorul (p′k+1 , . . . , p′j , . . . , p′n ) este răsturnatul acestuia s, i deci poate fi obt, inut din
acesta, de exemplu, prin interschimbări ı̂ntre termenii situat, i la egală distant, ă fat, ă de mijloc.
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 11

De exemplu, pentru permutarea curentă


(2, 7, 4, 8, 6, 5, 3, 1)
avem k = 3 (p3 = 4 < p4 = 8), j = 6 (pj = 5 > pk = 4), deci permutarea următoare se obt, ine
interschimbând ı̂ntâi pk = p3 = 4 cu pj = p6 = 5, apoi răsturnând subvectorul (8, 6, 4, 3, 1) dintre
pozit, iile k + 1 s, i n (de exemplu prin interschimbările 8 ↔ 1, 6 ↔ 3), adică această permutare
următoare este
(2, 7, 5, 1, 3, 4, 6, 8).
În pseudocod, algoritmul poate fi descris sub forma
PERMUTĂRI(n) :
for i = 1, n do p[i] ← i;
AFISARE(p, n);
repeat
k ← n − 1;
while (p[k] ≥ p[k + 1]) and (k > 0) do k ← k − 1;
if (k > 0) then
j ← n;
while (p[j] ≤ p[k]) do j ← j − 1;
p[k] ↔ p[j];
 
for i = 1, n−k
2
do p[k + i] ↔ p[n − i + 1];
AFISARE(p, n);
while (k > 0);
unde ↔ reprezintă instruct, iunea de interschimbare, iar [x] = ⌊x⌋ reprezintă partea ı̂ntreagă
(inferioară) a numărului x ∈ R.
Observat, ia 1.6.1. Pentru generarea permutărilor unei mult, imi arbitrare A = {a1 , a2 , . . . , an } ı̂nlocuim
afis, area indicilor (p1 , . . . , pn ) cu afis, area elementelor corespunzătoare (ap1 , . . . , apn ).

1.7 Combinări
Propozit, ia 1.7.1 (de numărare a combinărilor). Fie m, n ∈ N. Atunci
numărul de cuvinte strict crescătoare de lungime n peste un alfabet (ordonat) cu m litere
= numărul  de submult
 , imi cu n elemente ale unei mult, imi cu m elemente
[m]n def m
= = .
n! n
Demonstrat, ie. Fie B = {1, 2, . . . , m}. Notăm mult, imile din enunt, astfel:
C3 = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i, ci < ci+1 ∀ i}, S3 = {S|S ⊆ B, card (S) = n}.
Între aceste mult, imi definim funct, iile µ : C3 → S3 , ν : S3 → C3 prin:
• ∀ (c1 , c2 , . . . , cn ) ∈ C3 , µ(c1 , c2 , . . . , cn ) = {c1 , c2 , . . . , cn };
• ∀ {c1 , c2 , . . . , cn } ∈ S3 cu c1 < c2 < . . . < cn , ν({c1 , c2 , . . . , cn }) = (c1 , c2 , . . . , cn ).
Aceste funct, ii sunt inverse una celeilalte, deci sunt bijective s, i astfel card (C3 ) = card (S3 ).
Permutând fiecare combinare (c1 , c2 , . . . , cn ) ∈ C3 ı̂n toate cele n! moduri posibile, obt, inem fără
repetare toate aranjamentele din mult, imea C1 = {(a1 , a2 , . . . , an )|ai ∈ B ∀ i, ai 6= aj ∀i 6= j}.
[m]n
Deci card (C3 )·n! = card (C1 ). Conform Propozit, iei 1.5.1, card (C1 ) = [m]n , deci card (C3 ) = .
n!
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 12

Definit, ia 1.7.1. Oricare obiecte din cele 2 tipuri numărate ı̂n propozit, ia anterioarăse 
numesc com-
m
binări (fără repetit, ie) de m luate câte n. De asemenea s, i numărul lor, adică , se numes, te
n
n
tot combinări (fără repetit, ie) de m luate câte n s, i se mai notează cu Cm .
 
m
Observat, ia 1.7.1. Pentru n > m avem = 0, deoarece [m]n = 0.
n  
m! m m!
Pentru n ≤ m, deoarece [m]n = m(m − 1) . . . (m − n + 1) = avem = .
(m − n)! n n!(m − n)!
Exemplul 1.7.1. Pentru m = 5 s, i n = 3, corespondent, ele din demonstrat, ia anterioară sunt redate ı̂n
următorul tabel:
(c1 , c2 , c3 ) ∈ C3 S ∈ S3
(1,2,3) {1, 2, 3}
(1,2,4) {1, 2, 4}
(1,2,5) {1, 2, 5}
(1,3,4) {1, 3, 4}
(1,3,5) {1, 3, 5}
(1,4,5) {1, 4, 5}
(2,3,4) {2, 3, 4}
(2,3,5) {2, 3, 5}
(2,4,5) {2, 4, 5}
(3,4,5) {3, 4, 5}.
 
5 [5]3 5·4·3
Deci avem = = = 10 combinări.
3 3! 1·2·3
Algoritmul 1.7.1 (de generare a combinărilor). Fie mult, imea standard B = {1, 2, . . . , m} s, i
n ≤ m. Vom utiliza din nou ”regula următorului”.

• Prima combinare (de m luate câte n), ı̂n ordine lexicografică, este

(c1 , c2 , . . . , cn ) = (1, 2, . . . , n).

• O combinare arbitrară (curentă)

(c1 , c2 , . . . , ck−1 , ck , ck+1, . . . , cn )

are o combinare următoare dacă s, i numai dacă există un indice k ∈ {n, . . . , 1} astfel ı̂ncât
ck < m − n + k. În acest caz, luând cel mai mare indice k cu această proprietate, combinarea
următoare, ı̂n ordine lexicografică, este

(c1 , c2 , . . . , ck−1 , ck + 1, ck + 2, . . . , ck + 1 + n − k).

De exemplu, pentru m = 8, n = 6 s, i combinarea curentă (1, 2, 5, 6, 7, 8) avem k = 2 (c2 = 2 <


m − n + k = 8 − 6 + 2), deci combinarea următoare este (1, 3, 4, 5, 6, 7).
În pseudocod, algoritmul poate fi descris sub forma
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 13

COMBINĂRI(m, n) :
for i = 1, n do c[i] ← i;
AFISARE(c, n);
repeat
k ← n;
while (c[k] = m − n + k) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← c[i − 1] + 1;
AFISARE(c, n);
while (k > 0);

Algoritmul 1.7.2 (de generare a aranjamentelor). Fie mult, imea standard B = {1, 2, . . . , m} s, i
n ≤ m. Conform demonstrat, iei anterioare, putem genera aranjamentele de m luate câte n prin
generarea combinărilor s, i permutarea fiecărei combinări. Folosind Algoritmii 1.7.1 s, i 1.6.1 obt, inem
următoarea descriere ı̂n pseudocod.
ARANJAMENTE(m, n) :
for i = 1, n do c[i] ← i;
PERMUTĂRI(n);
repeat
k ← n;
while (c[k] = m − n + k) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← c[i − 1] + 1;
PERMUTĂRI(n);
while (k > 0);
unde PERMUTĂRI(n) este funct, ia din Algoritmul 1.6.1 ı̂nlocuind funct, ia de afis, are cu
AFISARE(c, p, n) :
for i = 1, n do
afis, ează c[p[i]];

Exemplul 1.7.2. Pentru m = 4 s, i n = 3, corespondent, a aranjamente ↔ permutările combinărilor din


demonstrat, ia anterioară s, i din algoritmul anterior este redată ı̂n următorul tabel:
Combinare Permutare Aranjament Combinare Permutare Aranjament
(1,2,3) (1,2,3) (1,2,3) (1,3,4) (1,2,3) (1,3,4)
(1,3,2) (1,3,2) (1,3,2) (1,4,3)
(2,1,3) (2,1,3) (2,1,3) (3,1,4)
(2,3,1) (2,3,1) (2,3,1) (3,4,1)
(3,1,2) (3,1,2) (3,1,2) (4,1,3)
(3,2,1) (3,2,1) (3,2,1) (4,3,1)
(1,2,4) (1,2,3) (1,2,4) (2,3,4) (1,2,3) (2,3,4)
(1,3,2) (1,4,2) (1,3,2) (2,4,3)
(2,1,3) (2,1,4) (2,1,3) (3,2,4)
(2,3,1) (2,4,1) (2,3,1) (3,4,2)
(3,1,2) (4,1,2) (3,1,2) (4,2,3)
(3,2,1) (4,2,1) (3,2,1) (4,3,2)
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 14
 
4
Deci avem · 3! = [4]3 = 4 · 3 · 2 = 24 aranjamente.
3
Observat, ia 1.7.2. Analog Observat, iei 1.6.1, algoritmii anteriori pot fi adaptat, i pentru generarea
combinărilor s, i aranjamentelor pentru mult, imi oarecare.

1.8 Combinări cu repetit, ie


Propozit, ia 1.8.1 (de numărare a combinărilor cu repetit, ie). Fie m, n ∈ N. Atunci numărul de
 
[m]n def m
cuvinte crescătoare de lungime n peste un alfabet (ordonat) cu m litere este egal cu = .
n! n
Demonstrat, ie. Fie B = {1, 2, . . . , m}, A = {1, 2, . . . , m + n − 1},

C4 = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i, ci ≤ ci+1 ∀ i}, C3 = {(d1 , d2 , . . . , dn )|di ∈ A ∀ i, di < di+1 ∀ i}.

Definim corespondent, ele ρ : C4 → C3 , σ : C3 → C4 astfel:


• ρ(c1 , c2 , c3 , . . . , cn ) = (c1 , c2 + 1, c3 + 2, . . . , cn + n − 1);
• σ(d1 , d2 , d3 , . . . , dn ) = (d1 , d2 − 1, d3 − 2, . . . , dn − n + 1).
Acestea sunt funct, ii inverse, deciutilizând Propozitia 1.7.1 avem
 
m+n−1 [m + n − 1]n [m]n m
card (C4 ) = card (C3 ) = = = = .
n n! n! n
Definit, ia 1.8.1. Cuvintele numărate ı̂n propozit, ia anterioară
 se numesc combinări cu repetit, ie
m
de m luate câte n. De asemenea s, i numărul lor, adică , se numes, te tot combinări cu
n
repetit, ie de m luate câte n.
Exemplul 1.8.1. Pentru m = 3 s, i n = 4, combinările cu repetit, ie sunt, ı̂n ordine lexicografică:

(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3), (1, 2, 2, 2), (1, 2, 2, 3),

(1, 2, 3, 3), (1, 3, 3, 3), (2, 2, 2, 2), (2, 2, 2, 3), (2, 2, 3, 3), (2, 3, 3, 3), (3, 3, 3, 3).
 
3 [3]4 3·4·5·6
Deci avem = = = 15 combinări cu repetit, ie.
4 4! 1·2·3·4
Algoritmul 1.8.1 (de generare a combinărilor cu repetit, ie). Fie mult, imea standard B = {1, 2, . . . , m}.
Vom utiliza din nou ”regula următorului”.
• Prima combinare cu repetit, ie (de m luate câte n), ı̂n ordine lexicografică, este
(c1 , c2 , . . . , cn ) = (1, 1, . . . , 1).

• O combinare cu repetit, ie arbitrară (curentă)


(c1 , c2 , . . . , ck−1 , ck , ck+1, . . . , cn )

are o combinare cu repetit, ie următoare dacă s, i numai dacă există un indice k ∈ {n, . . . , 1} astfel
ı̂ncât ck < m. În acest caz, luând cel mai mare indice k cu această proprietate, combinarea cu
repetit, ie următoare, ı̂n ordine lexicografică, este

(c1 , c2 , . . . , ck−1 , ck + 1, ck + 1, . . . , ck + 1).


TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 15

De exemplu, pentru m = 8, n = 6 s, i combinarea cu repetit, ie curentă (2, 4, 5, 8, 8, 8) avem k = 3


(c3 = 5 < m = 8) deci combinarea cu repetit, ie următoare este (2, 4, 6, 6, 6, 6).
În pseudocod, algoritmul poate fi descris sub forma
COMBINĂRI CU REPETIT , IE(m, n) :
for i = 1, n do c[i] ← 1;
AFISARE(c, n);
repeat
k ← n;
while (c[k] = m) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← c[k];
AFISARE(c, n);
while (k > 0);

Observat, ia 1.8.1. Analog Observat, iei 1.6.1, algoritmul anterior poate fi adaptat pentru generarea
combinărilor cu repetit, ie pentru mult, imi oarecare.

1.9 Permutări cu repetit, ie


Propozit, ia 1.9.1 (de numărare a permutărilor cu repetit, ie). Fie m, t1 , t2 , . . . , tm ∈ N s, i
n = t1 + t2 + · · · + tm . Atunci numărul de cuvinte de lungime n ce pot fi formate peste un alfabet cu
m litere astfel ı̂ncât  litera numărul  i să apară de exact ti ori pentru orice i ∈ {1, . . . , m} este egal cu
n! def n
= .
t1 !t2 ! . . . tm ! t1 , t2 , . . . , tm
Demonstrat, ie. Fie A = {1, 2, . . . , m} s, i

C5 = {(x1 , x2 , . . . , xn )|xi ∈ A ∀ i, card ({i|xi = j}) = tj ∀ j}.

Numărăm cuvintele din C5 astfel:


 
n
• alegem cei t1 indici (din totalul de n) ai literelor egale cu 1, rezultă moduri posibile;
t1
• pentru fiecare
 alegere de mai sus, alegem cei t2 indici  restulde n − t1 ) ai literelor egale cu
 (din
n − t1 n n − t1
2, rezultă moduri posibile, deci obt, inem moduri posibile de alegere a
t2 t1 t2
indicilor literelor 1 s, i 2;

• ...

• pentru fiecare alegere de mai  sus, alegem cei tm indici (din restul de n − t1 − . . . − tm−1 ) ai
n − t1 − . . . − tm−1
literelor egale cu m; rezultă moduri posibile, deci obt, inem
tm
    
n n − t1 n − t1 − . . . − tm−1
...
t1 t2 tm

moduri posibile de alegere a tuturor indicilor literelor 1, 2, . . . , m.


TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 16

Astfel
    
n n − t1 n − t1 − . . . − tm−1
card (C5 ) = ...
t1 t2 tm
n! (n − t1 )! (n − t1 − . . . − tm−1 )!
= · · ...·
t1 !(n − t1 )! t2 !(n − t1 − t2 )! tm !(n − t1 − . . . − tm )!
n!
=
t1 !t2 ! . . . tm !
(deoarece (n − t1 − . . . − tm )! = 0! = 1).
Definit, ia 1.9.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc permutări  cu repetit  , ie
n
(anagrame) de n luate câte t1 , t2 , . . . , tm . De asemenea s, i numărul lor, adică , se
t1 , t2 , . . . , tm
numes, te tot permutări cu repetit, ie de n luate câte t1 , t2 , . . . , tm .
 
n
Observat, ia 1.9.1. Luând t1 = t2 = · · · = tm = 1 obt, inem n = m s, i = n!, deci
1, 1, . . . , 1
permutările (fără repetit
 , ie) sunt
 un caz particular al permutărilor cu repetit, ie. Pe de altă parte,
n n!
luând m = 2 obt, inem = , deci s, i combinările (fără repetit, ie) sunt un caz particular al
t1 , t2 t1 !t2 !
permutărilor cu repetit, ie.
Exemplul 1.9.1. Pentru m = 3 s, i t1 = 2, t2 = t3 = 1, deci n = 4, permutările cu repetit, ie sunt, ı̂n
ordine lexicografică:

(1, 1, 2, 3), (1, 1, 3, 2), (1, 2, 1, 3), (1, 2, 3, 1), (1, 3, 1, 2), (1, 3, 2, 1),

(2, 1, 1, 3), (2, 1, 3, 1), (2, 3, 1, 1), (3, 1, 1, 2), (3, 1, 2, 1), (3, 2, 1, 1).
 
4 4!
Deci avem = = 12 permutări cu repetit, ie.
2, 1, 1 2!1!1!
Algoritmul 1.9.1 (de generare a permutărilor cu repetit, ie). Fie mult, imea standard B =
{1, 2, . . . , m} s, i t1 , t2 , . . . , tm ∈ N, n = t1 + t2 + · · · + tm . Vom utiliza din nou ”regula următorului”.
• Prima permutare cu repetit, ie (de n luate câte t1 , t2 , . . . , tm ), ı̂n ordine lexicografică, este

(p1 , p2 , . . . , pn ) = (1, 1, . . . , 1, 2, 2, . . . , 2, . . . , m, m, . . . , m).


| {z } | {z } | {z }
de t1 ori de t2 ori de tm ori

• Existent, a s, i forma permutării cu repetit, ie următoare ı̂n ordine lexicografică pentru o permutare
cu repetit, ie curentă arbitrară se determină exact ca la permutările fără repetit, ie (Algoritmul
1.6.1).
De exemplu, pentru permutarea cu repetit, ie curentă

(4, 4, 1, 3, 6, 5, 5, 3, 2, 1)

avem k = 4 (p4 = 3 < p5 = 6), j = 7 (pj = 5 > pk = 3), deci permutarea cu repetit, ie următoare se
obt, ine interschimbând ı̂ntâi pk = p4 = 3 cu pj = p7 = 5, apoi răsturnând subvectorul (6, 5, 3, 3, 2, 1)
dintre pozit, iile k + 1 s, i n (de exemplu prin interschimbările 6 ↔ 1, 5 ↔ 2, 3 ↔ 3), adică aceată
permutare cu repetit, ie următoare este

(4, 4, 1, 5, 1, 2, 3, 3, 5, 6).
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 17

În pseudocod, algoritmul poate fi descris sub forma


PERMUTĂRI CU REPETIT , IE(n, t, m) :
n ← 0;
for i = 1, m do n ← n + t[i];
i ← 0;
for j = 1, m do
for k = 1, t[j] do
i ← i + 1;
p[i] ← j;
AFISARE(p, n);
repeat
k ← n − 1;
while (p[k] ≥ p[k + 1]) and (k > 0) do k ← k − 1;
if (k > 0) then
j ← n;
while (p[j] ≤ p[k]) do j ← j − 1;
p[k] ↔ p[j];
 
for i = 1, n−k
2
do p[k + i] ↔ p[n − i + 1];
AFISARE(p, n);
while (k > 0);

Observat, ia 1.9.2. Analog Observat, iei 1.6.1, algoritmul anterior poate fi us, or adaptat pentru generarea
permutărilor cu repetit, ie pentru mult, imi arbitrare.
Tema 2

Partit, ii

2.1 Compuneri ale unui număr natural


Definit, ia 2.1.1. Fie n, m ∈ N. O compunere a lui n este o scriere de forma

n = n1 + n2 + · · · + nm ,

unde n1 , n2 , . . . , nm ∈ N s, i contează ordinea dintre termenii n1 , n2 , . . . , nm .

Propozit, ia 2.1.1 (de numărare a compunerilor unui număr   natural).


 Fie n, m ∈ N. Atunci:
m
a) numărul de compuneri ale lui n cu m termeni este egal cu ;
n  
n−1
b) numărul de compuneri ale lui n cu m termeni nenuli este egal cu .
m−1
Demonstrat, ie. a) Fie mult, imile

N = {(n1 , n2 , . . . , nm )|ni ∈ N ∀ i, n1 + n2 + · · · + nm = n},

C4 = {(c1 , c2 , . . . , cn )|ci ∈ {1, 2, . . . , m} ∀ i, ci ≤ ci+1 ∀ i}.


Definim corespondent, ele α : N → C4 , β : C4 → N prin:


 c1 = · · · = cn1 = 1 (n1 litere),

c
n1 +1 = · · · = cn1 +n2 = 2 (n2 litere),
• α(n1 , . . . , nm ) = (c1 , . . . , cn ), unde

 ...


cn1 +···+nm−1 +1 = · · · = cn1 +···+nm−1 +nm = m (nm litere);

• β(c1 , . . . , cn ) = (n1 , . . . , nm ), unde ni = numărul de litere i ale cuvântului (c1 , . . . , cn ), ∀ i.


 
m
Acestea sunt funct, ii inverse, deci conform Propozit, iei 1.8.1 avem card (N ) = card (C4 ) = .
n
b) Fie mult, imile N1 = {(n1 , n2 , . . . , nm )|ni ∈ N⋆ ∀ i, n1 + n2 + · · · + nm = n},

N2 = {(t1 , t2 , . . . , tm )|ti ∈ N ∀ i, t1 + t2 + · · · + tm = n − m}.

Definim corespondent, ele ϕ : N1 → N2 , ψ : N2 → N1 prin:

• ∀(n1 , . . . , nm ) ∈ N1 , ϕ(n1 , . . . , nm ) = (n1 − 1, . . . , nm − 1);

18
TEMA 2. PARTIT, II 19

• ∀(t1 , . . . , tm ) ∈ N2 , ψ(t1 , . . . , tm ) = (t1 + 1, . . . , tm + 1).


 
m
Acestea sunt funct, ii inverse, deci conform punctului a) avem card (N1 ) = card (N2 ) = =
  n−m
[m]n−m m(m + 1) . . . (n − 1) (n − 1)! n−1
= = = .
(n − m)! (n − m)! (m − 1)!(n − m)! m−1
Exemplul 2.1.1. Pentru n = 4 s, i m = 3 compunerile sunt
4 = 0+0+4= 0+1+3 =0+2+2 =0+3+1 =0+4+0
= 1+0+3= 1+1+2 =1+2+1 =1+3+0 =2+0+2
= 2 + 1 + 1 = 2 + 2 + 0 = 3 + 0 + 1 = 3 + 1 + 0 = 4 + 0 + 0.
     
3 3·4·5·6 4−1 3
Deci avem = = 15 compuneri, dintre care = = 3 compuneri cu
4 1·2·3·4 3−1 2
termenii nenuli.
Algoritmul 2.1.1 (de generare a compunerilor unui număr natural). Fie n, m ∈ N⋆ . Vom
utiliza din nou ”regula următorului”.
• Prima compunere a lui n cu m termeni, ı̂n ordine lexicografică, este
n = 0 + 0 + · · · + 0 + n.

• O compunere curentă arbitrară


n = t1 + t2 + · · · + tk−1 + tk + tk+1 + · · · + tm
are o compunere următoare dacă s, i numai dacă există un indice k ∈ {m, . . . , 2} astfel ı̂ncât
tk > 0. În acest caz, luând cel mai mare indice k cu această proprietate, compunerea următoare,
ı̂n ordine lexicografică, este
n = t1 + t2 + · · · + tk−2 + (tk−1 + 1) + 0 + · · · + 0 + (tk − 1).

De exemplu, următoarea compunere după


10 = 2 + 0 + 5 + 3 + 0 + 0
este 10 = 2 + 0 + 6 + 0 + 0 + 2 (deoarece tk = t4 = 3).
În pseudocod, algoritmul poate fi descris sub forma
COMPUNERI(n, m) :
for i = 1, m − 1 do t[i] ← 0;
t[m] ← n;
AFISARE(t, m);
repeat
k ← m;
while (t[k] = 0) and (k > 1) do k ← k − 1;
if (k > 1) then
t[k − 1] ← t[k − 1] + 1;
t[m] ← t[k] − 1;
if (k < m) then t[k] ← 0;
AFISARE(t, m);
while (k > 1);
TEMA 2. PARTIT, II 20

unde funct, ia de afis, are este


AFISARE(t, m) :
for i = 1, m do
afis, ează t[i];

Algoritmul 2.1.2 (de generare a compunerilor cu termeni nenuli). Analog algoritmului anterior
se obt, ine următorul algoritm pentru generarea compunerilor lui n cu m termeni nenuli, m ≤ n.
COMPUNERI TERMENI NENULI(n, m) :
for i = 1, m − 1 do t[i] ← 1;
t[m] ← n − m + 1;
AFISARE(t, m);
repeat
k ← m;
while (t[k] = 1) and (k > 1) do k ← k − 1;
if (k > 1) then
t[k − 1] ← t[k − 1] + 1;
t[m] ← t[k] − 1;
if (k < m) then t[k] ← 1;
AFISARE(t, m);
while (k > 1);

2.2 Partit, ii ale unui număr natural


Definit, ia 2.2.1. O partit, ie (descompunere) a numărului n ∈ N⋆ este o scriere de forma

n = n1 + n2 + · · · + nk ,

unde n1 , n2 , . . . , nk ∈ N⋆ (k ∈ N⋆ ) s, i nu contează ordinea dintre termenii n1 , n2 , . . . , nk .

Observat, ia 2.2.1. Deoarece ı̂ntr-o partit, ie ca mai sus nu contează ordinea dintre termeni, putem
presupune că aces, tia sunt scris, i ı̂n ordine crescătoare.

Definit, ia 2.2.2. Fie n, k ∈ N⋆ . Notăm cu P (n, k) numărul de partit, ii ale lui n cu k termeni, iar cu
P (n) numărul tuturor partit, iilor lui n.

Exemplul 2.2.1. Numărul n = 6 are partit, iile

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

deci P (6, 1) = 1, P (6, 2) = 3, P (6, 3) = 3, P (6, 4) = 2, P (6, 5) = 1, P (6, 6) = 1 s, i P (6) = 11.


Observat, ia 2.2.2. Avem P (n) = P (n, 1) + P (n, 2) + · · · + P (n, n), ∀ n ∈ N⋆ .

Propozit, ia 2.2.1 (relat, ia de recurent, ă a numerelor P (n, k)). Pentru orice n ∈ N⋆ s, i orice
k ∈ {1, . . . , n − 1} avem

P (n, k) = P (n − k, 1) + P (n − k, 2) + · · · + P (n − k, k).
TEMA 2. PARTIT, II 21

Demonstrat, ie. Pentru orice n ∈ N⋆ s, i orice k ∈ {1, . . . , n − 1} notăm

P(n, k) = {(n1 , . . . , nk )|ni ∈ N⋆ ∀ i, n1 ≤ · · · ≤ nk , n1 + · · · + nk = n}.

S
k S
k
Definim corespondent, ele α : P(n, k) → P(n − k, i) s, i β : P(n − k, i) → P(n, k) prin:
i=1 i=1

• ∀ (n1 , . . . , nk ) ∈ P(n, k), α(n1 , . . . , nk ) = (nj − 1, . . . , nk − 1), unde j = min{i|ni ≥ 2, i ∈


{1, . . . , k}} (există j, deoarece k ≤ n − 1);

• ∀ i ∈ {1, . . . , k}, ∀ (n1 , . . . , ni ) ∈ P(n − k, i), β(n1 , . . . , ni ) = (1, . . . , 1, n1 + 1, . . . , ni + 1).


| {z }
de k−i ori

Interpretarea acestor funct, ii este următoarea: aplicarea funct, iei α unei partit, ii a lui n cu k termeni
constă ı̂n mics, orarea cu 1 a fiecărui termen s, i eliminarea termenilor care astfel devin egali cu zero,
obt, inându-se o partit, ie a lui n − k cu cel mult k termeni. Reciproc, aplicarea funct, iei β unei partit, ii
a lui n − k cu cel mult k termeni constă ı̂n mărirea cu 1 a fiecărui termen s, i adăugarea de termeni
egali cu 1 pentru a obt, ine k termeni, astfel obt, inându-se o partit, ie a lui n cu k termeni.
k 
S
Funct, iile α s, i β sunt bine definite s, i inverse una celeilalte, deci card (P(n, k)) = card P(n − k, i) .
i=1
Cum mult, imile P(n − k, 1), . . . , P(n − k, k) sunt evident disjuncte două câte două, rezultă că
P
k
P (n, k) = P (n − k, i).
i=1

Observat, ia 2.2.3. Relat, ia de recurent, ă din Propozit, ia 2.2.1, ı̂mpreună cu condit, iile init, iale evidente
P (n, 1) = P (n, n) = 1, P (n, k) = 0 ∀ k > n permit calculul tuturor numerelor P (n, k), deci s, i al
numerelor P (n), conform Corolarului 2.2.2. De exemplu, tabelul numerelor P (n, k) s, i P (n) pentru
n ≤ 7 (s, i k ≤ 7) este:

P (n, k) k = 1 k = 2 k = 3 k=4 k=5 k=6 k=7 P (n)


n=1 1 0 0 0 0 0 0 1
n=2 1 1 0 0 0 0 0 2
n=3 1 1 1 0 0 0 0 3
n=4 1 2 1 1 0 0 0 5
n=5 1 2 2 1 1 0 0 7
n=6 1 3 3 2 1 1 0 11
n=7 1 3 4 3 2 1 1 15

Numerele P (n, k) nenule, aflate doar pe diagonala principală s, i sub această diagonală (adică 1 ≤ k ≤
n) formează triunghiul numerelor P (n, k).
Algoritmul 2.2.1 (de generare a partit, iilor lui n cu k termeni). Fie n, k ∈ N⋆ , k ≤ n. Pentru
generarea ı̂n ordine lexicografică a celor P (n, k) partit, ii ale lui n cu k termeni

(t1 , t2 , . . . , tk ), n = t1 + t2 + · · · + tk , ti ∈ N⋆ ∀i, t1 ≤ t2 ≤ · · · ≤ tk

folosim din nou ”regula următorului”.

• Prima partit, ie este (1, . . . , 1 , n − k + 1).


| {z }
de k−1 ori
TEMA 2. PARTIT, II 22

• O partit, ie curentă arbitrară


(t1 , t2 , . . . , tj−1 , tj , tj+1 , . . . , tk )
are o partit, ie următoare dacă s, i numai dacă există un indice j ∈ {k − 1, . . . , 1} astfel ı̂ncât
tj ≤ tk − 2. În acest caz, luând cel mai mare indice j cu această proprietate, următoarea
partit, ie este
(t1 , t2 , . . . , tj−1 , tj + 1, tj + 1, . . . , tj + 1, n − r),
unde r = t1 + t2 + · · · + tj−1 + (tj + 1) + (tj + 1) + · · · + (tj + 1).
De exemplu, următoarea partit, ie după
22 = 1 + 1 + 2 + 4 + 4 + 5 + 5
este
22 = 1 + 1 + 3 + 3 + 3 + 3 + 8
(deoarece tj = t3 = 2 ≤ tk − 2 = 5 − 2).
Descrierea ı̂n pseudocod a algoritmului are forma
GENERARE P(n, k) :
for i = 1, k − 1 do t[i] ← 1;
t[k] ← n − k + 1;
AFISARE(t, k);
repeat
j ← k − 1;
while (t[j] > t[k] − 2) and (j > 0) do j ← j − 1;
if (j > 0) then
t[j] ← t[j] + 1;
for i = j + 1, k − 1 do t[i] ← t[j];
r ← 0;
for i = 1, k − 1 do r ← r + t[i];
t[k] ← n − r;
AFISARE(t, k);
while (j > 0);
unde funct, ia de afis, are este aceeas, i ca ı̂n Algoritmul 2.1.1.

2.3 Partit, ii ale unei mult, imi finite


Definit, ia 2.3.1. O partit, ie a unei mult, imi nevide A este o scriere de forma
A = A1 ∪ A2 ∪ · · · ∪ Ak ,
unde submult, imile (părt, ile, clasele) A1 , A2 , . . . , Ak (k ∈ N⋆ ) sunt nevide s, i disjuncte două câte două,
s, i nu contează ordinea dintre aceste submult, imi. Considerăm că singura partit, ie a mult, imii vide este
partit, ia cu zero submult, imi.
Definit, ia 2.3.2. Fie n, k ∈ N.
a) Numărul lui Stirling de spet, a a doua, notat cu S(n, k), reprezintă numărul de partit, ii ale
unei mult, imi cu n elemente ı̂n k părt, i.
b) Numărul lui Bell, notat cu Bn , reprezintă numărul tuturor partit, iilor unei mult, imi cu n ele-
mente.
TEMA 2. PARTIT, II 23

Exemplul 2.3.1. Mult, imea A = {a, b, c} are partit, iile

A = {a, b, c} = {a, b} ∪ {c} = {a, c} ∪ {b} = {a} ∪ {b, c} = {a} ∪ {b} ∪ {c},

deci S(3, 1) = 1, S(3, 2) = 3, S(3, 3) = 1 s, i B3 = 5.


Observat, ia 2.3.1. Evident, avem B0 = 1 s, i Bn = S(n, 1) + S(n, 2) + · · · + S(n, n), ∀ n ∈ N⋆ .
Propozit, ia 2.3.1 (relat, ia de recurent, ă a numerelor S(n, k)).

S(n, k) = S(n − 1, k − 1) + kS(n − 1, k), ∀ n, k ∈ N⋆ .

Demonstrat, ie. Notăm

S(n, k) = {{A1 , . . . , Ak }|Ai 6= ∅ ∀ i, Ai ∩ Aj = ∅ ∀ i 6= j, A = A1 ∪ · · · ∪ Ak },

pentru orice n, k ∈ N⋆ . Definim corespondent, ele

α : S(n, k) → S(n − 1, k − 1) ∪ {1, . . . , k} × S(n − 1, k),


β : S(n − 1, k − 1) ∪ {1, . . . , k} × S(n − 1, k) → S(n, k),

prin:
• ∀ {A1 , . . . , Ak } ∈ S(n, k), α({A1 , . . . , Ak }) =

{A1 , . . . , Ak } \ {Ai }, dacă n ∈ Ai s, i Ai = {n},
=
(i, {A1 , . . . , Ai \ {n}, . . . , Ak }), dacă n ∈ Ai s, i Ai 6= {n};

• ∀ {A1 , . . . , Ak−1 } ∈ S(n − 1, k − 1), β({A1 , . . . , Ak−1}) = {A1 , . . . , Ak−1, {n}},


• ∀ (i, {A1 , . . . , Ak }) ∈ {1, . . . , k} × S(n − 1, k), β(i, {A1 , . . . , Ak }) = {A1 , . . . , Ai ∪ {n}, . . . , Ak }.
Interpretarea acestor definit, ii este următoarea: aplicarea funct, iei α unei partit, ii a mult, imii {1, . . . , n}
ı̂n k părt, i constă ı̂n eliminarea elementului n, astfel obt, inându-se o partit, ie a mult, imii {1, . . . , n − 1}
ı̂n k − 1 sau ı̂n k părt, i, după cum n este sau nu singur ı̂ntr-o parte. Reciproc, aplicarea funct, iei β
constă ı̂n adăugarea elementului n, fie singur ı̂ntr-o parte, fie la oricare din cele k părt, i.
Funct, iile α s, i β sunt bine definite s, i inverse una celeilalte, deci

card (S(n, k)) = card (S(n − 1, k − 1) ∪ {1, . . . , k} × S(n − 1, k)) ,

adică S(n, k) = S(n − 1, k − 1) + kS(n − 1, k).


Observat, ia 2.3.2. Relat, ia de recurent, ă de mai sus ı̂mpreună cu condit, iile init, iale evidente S(0, 0) = 1,
S(0, k) = 0 ∀ k ≥ 1, S(n, 0) = 0 ∀n ≥ 1 permit calculul tuturor numerelor S(n, k), deci s, i al numerelor
Bn , conform Corolarului 2.3.1. De exemplu, tabelul numerelor S(n, k) s, i Bn pentru n ≤ 6 (s, i k ≤ 6)
este:
S(n, k) k = 0 k = 1 k=2 k=3 k=4 k=5 k = 6 Bn
n=0 1 0 0 0 0 0 0 1
n=1 0 1 0 0 0 0 0 1
n=2 0 1 1 0 0 0 0 2
n=3 0 1 3 1 0 0 0 5
n=4 0 1 7 6 1 0 0 15
n=5 0 1 15 25 10 1 0 52
n=6 0 1 31 90 65 15 1 203
TEMA 2. PARTIT, II 24

Numerele S(n, k) nenule, aflate doar pe diagonala principală s, i sub această diagonală (1 ≤ k ≤ n)
formează triunghiul numerelor lui Stirling de spet, a a doua.
Algoritmul 2.3.1 (de generare a partit, iilor unei mult, imi ı̂ntr-un număr fixat de părt, i). Fie
A = {1, 2, . . . , n} s, i 1 ≤ k ≤ n. Pentru scrierea unei partit, ii

A = A1 ∪ · · · ∪ Ak

vom folosi convent, ia că ı̂n fiecare parte Ai elementele sunt ordonate crescător, iar ordinea dintre
părt, ile A1 , . . . , Ak este dată de ordinea dintre cele mai mici elemente ale acestor mult, imi.
De exemplu, partit, ia
{1, 2, 3, 4, 5} = {3, 2} ∪ {5} ∪ {4, 1}
va fi scrisă sub forma
{1, 2, 3, 4, 5} = {1, 4} ∪ {2, 3} ∪ {5}. (2.3.1)
Pentru reprezentarea unei partit, ii A = A1 ∪ · · · ∪ Ak scrise conform convent, iei de mai sus, vom folosi
vectorul caracteristic v = (v1 , . . . , vn ), unde

vi = j dacă i ∈ Aj , ∀ i ∈ {1, 2, . . . , n}, ∀ j ∈ {1, 2, . . . , k}.

De exemplu, vectorul caracteristic al partit, iei (2.3.1) este v = (1, 2, 2, 1, 3).


Cu această reprezentare, conform demonstrat, iei relat, iei de recurent, ă a numerelor S(n, k) (Propozit, ia
2.3.1) obt, inem un algoritm recursiv de generare a partit, iilor mult, imii {1, 2, . . . , n} ı̂n k părt, i. În pseu-
docod, acest algoritm poate fi descris sub forma
GENERARE S(n, k) :
if (k = 1) then // condit, ie init, ială
for i = 1, n do v[i] ← 1; // partit, ia cu o parte
AFISARE(v);
else
if (k = n) then // condit, ie init, ială
for i = 1, n do v[i] ← i; // partit, ia cu n părt, i
AFISARE(v);
else
// relat, ia de recurent, ă
v[n] ← k; GENERARE S(n − 1, k − 1); // n singur ı ^n parte
for i = 1, k do // n nesingur ı ^n parte
v[n] ← i; GENERARE S(n − 1, k);

unde funct, ia de afis, are, ce transformă vectorul caracteristic v ı̂n partit, ia corespunzătoare, este
AFISARE(v) :
for j = 1, k do // afis, ăm partea Aj
afis, ează ”{”
for i = 1, n do
if (v[i] = j) then afis, ează i;
afis, ează ”}”;
Tema 3

Grafuri

Grafurile sunt modele matematice cu o gamă largă de aplicat, ii. Această aplicabilitate a condus
la dezvoltarea accelerată a teoriei grafurilor, atât din punct de vedere al rezultatelor teoretice cât
s, i al algoritmicii, grafurile impunându-se drept modele de bază ı̂n informatică, ı̂n special ı̂n teoria
structurilor de date s, i a analizei algoritmilor.

3.1 Definit, ii generale


Definit, ia 3.1.1. Un graf neorientat (graf, pseudograf, graf general) este o pereche G = (V, E)
unde:

• V este o mult, ime finită s, i nevidă, elementele sale numindu-se nodurile (vârfurile, punctele)
grafului G;

• E este o colect, ie (mult, ime multiplă, multiset) finită de perechi neordonate, posibil egale, de
noduri, elementele sale numindu-se muchiile (legăturile directe, liniile) grafului G.

Observat, ia 3.1.1. Într-o pereche neordonată, notată [x, y], nu contează ordinea dintre elemente, adică
[x, y] = [y, x].

Definit, ia 3.1.2. Un graf orientat (digraf, pseudodigraf) este o pereche G = (V, E) unde:

• V este o mult, ime finită s, i nevidă, elementele sale numindu-se vârfurile (nodurile, punctele)
grafului G;

• E este o colect, ie (mult, ime multiplă, multiset) finită de perechi ordonate de vârfuri, elementele
sale numindu-se arcele (legăturile directe ale) grafului G.

Observat, ia 3.1.2. Într-o pereche ordonată, notată (x, y), contează ordinea dintre elemente, adică
(x, y) 6= (y, x) pentru x 6= y.

Definit, ia 3.1.3. Numărul de noduri ale unui graf (neorientat sau orientat) se numes, te ordinul
grafului, iar numărul de muchii sau arce se numes, te dimensiunea grafului.

Definit, ia 3.1.4. a) Dacă e = [x, y] este o muchie a unui graf neorientat, atunci nodurile x s, i y
se numesc extremităt, ile muchiei e s, i spunem că muchia e este incidentă cu nodurile x s, i
y.

25
TEMA 3. GRAFURI 26

b) Dacă e = (x, y) este un arc al unui graf orientat, atunci nodul x se numes, te extremitatea
init, ială iar nodul y se numes, te extremitatea finală a arcului e s, i spunem că arcul e este
incident cu x spre exterior s, i cu y spre interior.

c) O buclă a unui graf (neorientat sau orientat) este o muchie sau un arc având extremităt, ile
egale (adică o muchie de forma [x, x], respectiv un arc de forma (x, x)).

d) Două noduri x s, i y ale unui graf (neorientat sau orientat) se numesc adiacente (vecine) dacă
există o muchie sau un arc incident cu x s, i cu y (adică o muchie de forma [x, y], respectiv un
arc de forma (x, y) sau de forma (y, x)).

Definit, ia 3.1.5. Dacă ı̂n colect, ia (mult, imea multiplă) de muchii sau arce a unui graf (neorientat
sau orientat) există două sau mai multe elemente egale (s, i aflate pe pozit, ii diferite), atunci acestea
se numesc muchii sau arce multiple.

Definit, ia 3.1.6. Un graf (neorientat sau orientat) fără bucle se numes, te multigraf (neorientat,
respectiv orientat).

Definit, ia 3.1.7. Un graf (neorientat sau orientat) se numes, te simplu (sau strict) dacă nu cont, ine
nici bucle s, i nici muchii sau arce multiple.

Observat, ia 3.1.3. a) Un graf neorientat simplu este o pereche G = (V, E), unde V este o mult, ime
finită s, i nevidă (de elemente numite noduri) iar E ⊆ P2 (V ) este o mult, ime finită (de elemente numite
muchii), unde

P2 (V ) = {{x, y}|x, y ∈ V, x 6= y}

(mult, imea tuturor submult, imilor cu două elemente ale lui V ).


b) Un graf orientat simplu este o pereche G = (V, E), unde V este o mult, ime finită s, i nevidă (de
elemente numite noduri) iar E ⊆ V × V \ {(x, x)|x ∈ V } este o mult, ime finită (de elemente numite
arce).

Definit, ia 3.1.8. Fie G = (V, E) un graf (orientat sau neorientat). O reprezentare grafică a lui
G se obt, ine reprezentând nodurile sale prin puncte distincte (ı̂n plan sau pe o altă suprafat, ă dată),
iar muchiile [x, y] sau arcele (x, y) prin segmente (de curbă continuă) distincte neorientate, respectiv
orientate, de la punctul ce reprezintă nodul x până la punctul ce reprezintă nodul y.

Observat, ia 3.1.4. În reprezentările grafice, nodurile unui graf sunt reprezentate adesea ı̂ncadrate ı̂n
cerculet, e (sau pătrătele).
Exemplul 3.1.1. Graful neorientat G = (V, E), cu V = {1, 2, 3, 4, 5, 6} s, i 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 mult, ime multiplă!) are reprezentarea grafică din Figurile 3.1.1 (cu nodurile reprezen-
tate prin puncte) s, i 3.1.2 (cu nodurile reprezentate ı̂n cerculet, e).
TEMA 3. GRAFURI 27

e3
1 e1 2 3

e2 e4 e5 e6
e7
4 e8 5
e9 6

Figura 3.1.1:

e3

e1
1 2 3

e2 e4 e5 e6
e7
e8
4 5 6
e9

Figura 3.1.2:

Acest graf are ordinul 6 s, i dimensiunea 9. El cont, ine bucla e3 , muchiile multiple e5 , e6 s, i muchiile
multiple e7 , e8 , e9 , deci nu este nici multigraf, nici simplu. Nodurile 1 s, i 2 sunt adiacente, iar nodurile
1 s, i 5 nu sunt adiacente.
Exemplul 3.1.2. Graful orientat G = (V, E), cu V = {1, 2, 3, 4, 5} s, i

E = {(1, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (5, 4)}

este un graf simplu având reprezentarea grafică din Figurile 3.1.3 cu nodurile reprezentate prin
puncte) s, i 3.1.4 (cu nodurile reprezentate ı̂n cerculet, e).
TEMA 3. GRAFURI 28

1 2
5

3 4
Figura 3.1.3:

1 2

3 4

Figura 3.1.4:

Arcul (3, 1) are extremitatea init, ială 3 s, i extremitatea finală 1.

Definit, ia 3.1.9. Fie G1 = (V1 , E1 ) s, i G2 = (V2 , E2 ) două grafuri (ambele orientate sau ambele
neorientate).

a) Spunem că G1 este un subgraf al lui G2 s, i notăm G1 ⊆ G2 dacă V1 ⊆ V2 s, i E1 ⊆ E2 .

b) Spunem că G1 este un graf part, ial al lui G2 dacă V1 = V2 s, i E1 ⊆ E2 .

Definit, ia 3.1.10. Fie G = (V, E) un graf (neorientat sau orientat) s, i U ⊆ V o submult, ime nevidă
de noduri. Subgraful indus (generat) de U ı̂n G este subgraful G[U] = (U, F ), unde F este
colect, ia tuturor muchiilor sau arcelor din E ce au ambele extremităt, i ı̂n U.

Definit, ia 3.1.11. Fie G = (V, E) un graf (orientat sau neorientat) s, i F ⊆ E o colect, ie de muchii
sau de arce.

a) Subgraful indus (generat) de F ı̂n G este subgraful G[F ] = (U, F ), unde U este mult, imea
tuturor nodurilor din V ce sunt extremităt, i pentru cel put, in o muchie sau un arc din F .

b) Graful part, ial indus (generat) de F ı̂n G este graful part, ial (V, F ).

Exemplul 3.1.3. Pentru graful neorientat din Exemplul 3.1.1, subgraful generat de submult, imea de
noduri {1, 3, 4, 5} are reprezentarea din Figura 3.1.5.
TEMA 3. GRAFURI 29

1 3

e2
e7
e8
4 5
e9

Figura 3.1.5:

Pentru graful orientat din Exemplul 3.1.2, subgraful generat de submult, imea de arce {(2, 3), (5, 4)}
are reprezentarea din Figura 3.1.6, iar graful part, ial generat de aceeas, i submult, ime de arce are
reprezentarea din Figura 3.1.7.

2 1 2

5 5

3 4 3 4

Figura 3.1.6: Figura 3.1.7:

Definit, ia 3.1.12. Fie G = (V, E) un graf (neorientat sau orientat) s, i U ⊆ V o submult, ime de
noduri a.ı̂. U 6= V . Subgraful obt, inut din G prin eliminarea nodurilor mult, imii U este
subgraful G \ U = (V \ U, F ), unde F este colect, ia tuturor muchiilor sau arcelor din E ce nu sunt
incidente cu niciun nod din U.
Definit, ia 3.1.13. Fie G = (V, E) un graf (neorientat sau orientat) s, i F ⊆ E o colect, ie de muchii
sau arce. Graful part, ial obt, inut din G prin eliminarea muchiilor sau arcelor din F este
G \ F = (V, E \ F ) (adică subgraful ce cont, ine toate nodurile lui G s, i muchiile sau arcele lui G care
nu apart, in lui F ).
Exemplul 3.1.4. Pentru graful orientat din Exemplul 3.1.2, subgraful obt, inut prin eliminarea nodului
2 are reprezentarea din Figura 3.1.8.

3 4

Figura 3.1.8:
TEMA 3. GRAFURI 30

Pentru graful neorientat din Exemplul 3.1.1, graful part, ial obt, inut prin eliminarea muchiilor
e2 , e4 , e6 , e8 are reprezentarea din Figura 3.1.9.

e3
e1
1 2 3

e5
e7

4 5 6
e9

Figura 3.1.9:

Observat, ia 3.1.5. Fie G = (V, E) un graf (neorientat sau orientat) s, i U ⊆ V .


a) Dacă U 6= ∅, atunci G[U] = G \ (V \ U).
b) Dacă U 6= V , atunci G \ U = G[V \ U].
Observat, ia 3.1.6. Fie G = (V, E) un graf (neorientat sau orientat) s, i F ⊆ E.
a) Graful part, ial indus de F ı̂n G este G \ (E \ F ).
b) Graful part, ial G \ F este chiar graful part, ial indus de E \ F ı̂n G.

3.2 Reprezentarea (memorarea) grafurilor


În continuare descriem câteva forme de reprezentare (memorare) a grafurilor ı̂n informatică. Dintre
aceste forme, cea mai utilizată este matricea de adiacent, ă.
Definit, ia 3.2.1. Fie G = (V, E) un graf (neorientat sau orientat) unde V = {v1 , . . . , vn } s, i E =
{e1 , . . . , em }. Matricea de adiacent, ă asociată grafului G este matricea A = (aij )i,j=1,n definită
prin
aij = numărul de muchii sau de arce ek ∈ E de la nodul vi la nodul vj (adică muchii de forma
ek = [vi , vj ], respectiv arce de forma ek = (vi , vj )), ∀i, j ∈ {1, . . . , n}.
Observat, ia 3.2.1. a) Dacă graful neorientat G = (V, E) este simplu, atunci

1, dacă vi s, i vj sunt adiacente (adică [vi , vj ] ∈ E),
aij =
0, ı̂n caz contrar.
b) Dacă graful orientat G = (V, E) este simplu, atunci

1, dacă (vi , vj ) ∈ E,
aij =
0, ı̂n caz contrar.
TEMA 3. GRAFURI 31

Exemplul 3.2.1. Matricea de adiacent, ă asociată grafului neorientat din Exemplul 3.1.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 adiacent, ă asociată grafului orientat din Exemplul 3.1.2 este
 
0 1 0 0 0
 0 0 1 1 1 
 
A=  1 1 0 0 0 .

 0 0 0 0 0 
0 0 0 1 0

Observat, ia 3.2.2. Evident, orice graf neorientat are matricea de adiacent, ă simetrică (aij = aji ∀ i, j).

Propozit, ia 3.2.1. Fie V = {v1 , . . . , vn }, n ∈ N⋆ .


n(n−1)
a) Numărul de grafuri neorientate simple având mult, imea de noduri V este egal cu 2 2 .
2 −n
b) Numărul de grafuri orientate simple având mult, imea de noduri V este egal cu 2n .

Demonstrat, ie. a) Orice graf neorientat simplu având mult, imea de noduri V este bine determinat de
matricea sa de adiacent, ă, care este o matrice binară (cu elemente 0 s, i 1), simetrică s, i cu elementele
de pe diagonala principală egale cu zero. Cum o astfel de matrice este bine determinată de cele

n(n − 1)
n −1+···+2+1 =
2
elemente 0 sau 1 de deasupra diagonalei principale, utilizând Propozit, ia 1.4.1 obt, inem că numărul
n(n−1)
de astfel de matrice este egal cu 2 2 .
Punctul b) se demonstrează analog, folosind acum faptul că matricea de adiacent, ă a unui graf
orientat simplu este o matrice binară cu elementele de pe diagonala principală egale cu zero, deci
este bine determinată de cele n2 − n elemente 0 sau 1 nesituate pe această diagonală.

Definit, ia 3.2.2. Fie G = (V, E) un graf, unde V = {v1 , . . . , vn } s, i E = {e1 , . . . , em }, E 6= ∅.

a) Dacă G este neorientat, atunci matricea de incident, ă asociată grafului G este matricea
B = (bij ) i = 1, n definită prin
j = 1, m

 0, dacă ej nu este incidentă cu vi ,
bij = 1, dacă ej nu este buclă s, i este incidentă cu vi ,

2, dacă ej este o buclă incidentă cu vi ,

∀ i ∈ {1, . . . , n}, ∀ j ∈ {1, . . . , m}.


TEMA 3. GRAFURI 32

b) Dacă G este orientat s, i fără bucle, atunci matricea de incident, ă asociată grafului G este
matricea B = (bij ) i = 1, n definită prin
j = 1, m

 0, dacă ej nu este incidentă cu vi ,
bij = 1, dacă ej este incidentă cu vi spre exterior,

−1, dacă ej este incidentă cu vi spre interior,

∀ i ∈ {1, . . . , n}, ∀ j ∈ {1, . . . , m}.

Exemplul 3.2.2. Matricea de incident, ă a grafului neorientat din Exemplul 3.1.1 este
 
1 1 0 0 0 0 0 0 0
 1 0 2 1 0 0 0 0 0 
 
 0 0 0 0 1 1 0 0 0 
B=  0
,
 1 0 0 0 0 1 1 1  
 0 0 0 1 0 0 1 1 1 
0 0 0 0 1 1 0 0 0

iar matricea de incident, ă a grafului orientat din Exemplul 3.1.2 este


 
1 0 0 0 −1 0 0
 −1 1 1 1 0 −1 0 
 
B=  0 −1 0 0 1 1 0 .

 0 0 −1 0 0 0 −1 
0 0 0 −1 0 0 1

Observat, ia 3.2.3. Fie G = (V, E) un graf (neorientat sau orientat), unde V = {v1 , . . . , vn } s, i E =
{e1 , . . . , em }, E 6= ∅. O altă reprezentare a grafului G este matricea T ce ret, ine ı̂n fiecare coloană
extremităt, ile unei muchii sau arc, adică T = (tkj ) k = 1, 2 definită prin t1j = x, t2j = y, unde
j = 1, m
ej = [x, y] (pentru muchii) sau ej = (x, y) (pentru arce), ∀ j ∈ {1, . . . , m}. Pentru graful din
Exemplul 3.1.1 matricea T este
 
1 1 2 2 3 3 4 4 4
T = ,
2 4 2 5 6 6 5 5 5

iar pentru graful din Exemplul 3.1.2 matricea T este


 
1 2 2 2 3 3 5
T = .
2 3 4 5 1 2 4

Observat, ia 3.2.4. O altă formă frecvent utilizată ı̂n reprezentarea grafurilor simple este dată de
listele de adiacent, ă (memorate static sau dinamic). Lista de adiacent, ă a unui nod x este formată
din toate nodurile y pentru care există muchie sau arc de la x la y (y se numes, te succesor direct
al lui x). Pentru graful orientat din Exemplul 3.1.2, listele de adiacent, ă sunt

L(1) = {2}, L(2) = {3, 4, 5}, L(3) = {1, 2}, L(4) = ∅, L(5) = {4},

unde L(i) reprezintă lista de adiacent, ă a nodului i. Pentru grafurile orientate simple, deseori se
memorează s, i listele de predecesori direct, i. Lista de predecesori direct, i a unui nod x este formată
TEMA 3. GRAFURI 33

din toate nodurile y pentru care există arc de la y la x (y se numes, te predecesor direct al lui x).
Pentru graful din Exemplul 3.1.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 not, iunile de succesor direct s, i predecesor direct coincid, fiind s, i
sinonime cu not, iunile de vecin sau adiacent.
Observat, ia 3.2.5. Alegerea uneia sau alteia dintre formele de reprezentare a grafurilor descrise mai
sus depinde de eficient, a s, i de us, urint, a implementării operat, iilor necesare de prelucrare a acestor
forme, deci de tipul problemei modelate prin grafuri s, i de algoritmul de rezolvare utilizat.

3.3 Grade, secvent, e grafice


Definit, ia 3.3.1. Fie G = (V, E) un graf s, i x ∈ V un nod arbitrar fixat.
a) Dacă 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) reprezintă numărul de muchii e ∈ E ce nu sunt bucle s, i sunt incidente cu x, iar b(x)
este numărul de bucle e ∈ E ce sunt incidente cu x.

b) Dacă G este orientat, atunci:


• gradul de ies, ire (semigradul exterior) al lui x, notat d+ +
G (x) = d (x), reprezintă
numărul de arce e ∈ E incidente cu x spre exterior;
• gradul de intrare (semigradul interior) al lui x, notat d−
G (x) = d (x), reprezintă

numărul 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 3.3.1. Pentru graful neorientat din Exemplul 3.1.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 3.1.2, gradele nodurilor sunt:

d+ (1) = 1, d− (1) = 1, d(1) = 2,


d+ (2) = 3, d− (2) = 2, d(2) = 5,
d+ (3) = 2, d− (3) = 1, d(3) = 3,
d+ (4) = 0, d− (4) = 2, d(4) = 2,
d+ (5) = 1, d− (5) = 1, d(5) = 2.

Definit, ia 3.3.2. Fie G = (V, E) un graf. Un nod x ∈ V cu dG (x) = 0 se numes, te nod izolat, iar
un nod y ∈ V cu dG (y) = 1 se numes, te nod terminal.
Propozit, ia 3.3.1. Fie G = (V, E) un graf, V = {v1 , . . . , vn }, s, i fie A = (aij )i,j=1,n matricea de
adiacent, ă a grafului G.
P
n
a) Dacă G este neorientat, atunci d(vi ) = aii + aij , ∀ i ∈ {1, . . . , n}.
j=1
TEMA 3. GRAFURI 34

P
n P
n
b) Dacă G este orientat, atunci d+ (vi ) = aij , d− (vi ) = aji , ∀ i ∈ {1, . . . , n}.
j=1 j=1

Demonstrat, ie. Egalităt, ile din enunt, sunt evidente, conform definit, iilor gradelor s, i matricei de adia-
cent, ă.
Observat, ia 3.3.1. Dacă graful G este simplu, atunci aii = 0 ∀ i s, i egalitatea de la punctul a) al
P
n
propozit, iei anterioare devine d(vi ) = aij .
j=1

P
Propozit, ia 3.3.2 (Euler). Fie G = (V, E) un graf având dimensiunea m. Atunci d(x) = 2m.
x∈V
P + P −
În plus, dacă G este orientat atunci d (x) = d (x) = m.
x∈V x∈V

Demonstrat, ie. a) Considerăm că G este neorientat. Atunci fiecare muchie e = [vi , vj ] ∈ E (din cele
m muchii) contribuie cu 1 la d(vi ) s, i cu 1 la d(vj ) (cu 2 la d(vi ) dacă vi = vj , adică e = buclă), deci
P
cu 2 la suma d(x). Rezultă că această sumă este egală cu 2m.
x∈V
b) Considerăm că G este orientat. Deoarece fiecare arc e = (vi , vj ) ∈ E contribuie cu 1 la
+
P + P −
d (vi ), deci la d (x), s, i tot cu 1 la d− (vj ), deci la d (x), rezultă că aceste sume sunt egale
x∈V x∈V
P
cu numărul total de arce, adică cu m. Cum d(x) = d+ (x) + d− (x) ∀ x ∈ V , obt, inem s, i d(x) =
x∈V
P + P −
d (x) + d (x) = 2m.
x∈V x∈V

Propozit, ia 3.3.3. Fie d1 , d2, . . . , dn ∈ N, unde n ∈ N∗ . Atunci numerele d1 , d2 , . . . , dn sunt gradele


Pn
nodurilor unui graf neorientat de ordinul n dacă s, i numai dacă suma di este un număr par.
i=1

P
n
Demonstrat, ie. ”⇒” Conform Propozit, iei 3.3.2 avem di = 2m, unde m este dimensiunea grafului
i=1
având gradele nodurilor d1 , d2 , . . . , dn , deci suma considerată este un număr par.
Pn
”⇐” Demonstrăm că dacă di = 2m cu m ∈ N, atunci există un graf neorientat G = (V, E) cu
i=1
V = {v1 , . . . , vn } astfel ı̂ncât dG (vi ) = di , ∀ i ∈ {1, . . . , n}, prin induct, ie după m.
Pentru m = 0 rezultă că di = 0, ∀ i ∈ {1, . . . , n}, deci luând E = ∅ avem dG (vi ) = 0 = di ,
∀ i ∈ {1, . . . , n}.
Presupunem afirmat, ia adevărată pentru m − 1 s, i o demonstrăm pentru m, unde m ∈ N∗ . Fie
Pn
di = 2m. Avem două cazuri.
i=1
Cazul 1) Există j, k ∈ {1, . . . , n}, j 6= k, astfel ı̂ncât dj ≥ 1 s, i dk ≥ 1. Fie

′ di − 1, dacă i ∈ {j, k},
di =
di , dacă i ∈ {1, . . . , n} \ {j, k}.
P
n P
n
Atunci d′i = di − 2 = 2(m − 1), deci, conform ipotezei de induct, ie, există un graf neorientat
i=1 i=1
G′ = (V, E ′ ) cu V = {v1 , . . . , vn } astfel ı̂ncât dG′ (vi ) = d′i , ∀ i ∈ {1, . . . , n}. Fie graful G =
(V, E ′ ∪ {e}), unde e = [vj , vk ], e 6∈ E ′ . Evident, avem dG (vj ) = dG′ (vj ) + 1 = d′j + 1 = dj ,
dG (vk ) = dG′ (vk ) + 1 = d′k + 1 = dk s, i dG (vi ) = dG′ (vi ) = d′i = di pentru orice i ∈ {1, . . . , n} \ {j, k}.
Astfel dG (vi ) = di , ∀ i ∈ {1, . . . , n}.
TEMA 3. GRAFURI 35

Cazul 2) Există j ∈ {1, . . . , n} astfel ı̂ncât di = 0 pentru orice i ∈ {1, . . . , n} \ {j}. Atunci
P
n
dj = di = 2m. Fie graful G = (V, E), cu V = {v1 , . . . , vn } s, i E = {e1 , . . . , em }, unde ek = [vj , vj ],
i=1
∀ k ∈ {1, . . . , m}, iar buclele e1 , . . . , em sunt distincte două câte două. Evident, avem dG (vj ) = 2m =
dj s, i dG (vi ) = 0 = di pentru orice i ∈ {1, . . . , n} \ {j}. Astfel, din nou, dG (vi ) = di , ∀ i ∈ {1, . . . , n}.
Demonstrat, ia prin induct, ie este ı̂ncheiată.
Observat, ia 3.3.2. Demonstrat, ia propozit, iei anterioare este constructivă, ea indicând un algoritm de
generare a unui graf neorientat cu gradele nodurilor date.
Exemplul 3.3.2. Numerele 1, 1, 1, 2, 4, 4, 5, 5 nu pot fi gradele nodurilor unui graf neorientat, deoarece
P
8
suma di = 23 este un număr impar.
i=1
Exemplul 3.3.3. Numerele 1, 1, 1, 1, 2, 2, 3, 13 pot fi gradele nodurilor unui graf neorientat, deoarece
P
8
suma di = 24 este un număr par. Mai mult, conform demonstrat, iei propozit, iei anterioare (partea
i=1
”⇐”), un graf având gradele nodurilor numerele date se construies, te adăugând succesiv câte o muchie
ı̂ntre două noduri de grade nenule, grade care se mics, orează cu 1, până când fie toate gradele devin
egale cu zero, fie rămâne un grad nenul d′i , par, care este anulat s, i el prin d′i /2 bucle. Acest procedeu
este evident, iat ı̂n tabelul următor:
Pas Gradele rămase Muchia adăugată
1 1, 1, 1, 1, 2, 2, 3, 13 [v1 , v2 ]
2 0, 0, 1, 1, 2, 2, 3, 13 [v3 , v4 ]
3 0, 0, 0, 0, 2, 2, 3, 13 [v5 , v6 ]
4 0, 0, 0, 0, 1, 1, 3, 13 [v5 , v6 ]
5 0, 0, 0, 0, 0, 0, 3, 13 [v7 , v8 ]
6 0, 0, 0, 0, 0, 0, 2, 12 [v7 , v8 ]
7 0, 0, 0, 0, 0, 0, 1, 11 [v7 , v8 ]
8 0, 0, 0, 0, 0, 0, 0, 10 [v8 , v8 ] de 5 ori
– 0, 0, 0, 0, 0, 0, 0, 0 –
Graful obt, inut are matricea de adiacent, ă
 
0 1 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 
 
 0 0 0 1 0 0 0 0 
 
 0 0 1 0 0 0 0 0 
A=  0
.

 0 0 0 0 2 0 0 
 0 0 0 0 2 0 0 0 
 
 0 0 0 0 0 0 0 3 
0 0 0 0 0 0 3 5

Propozit, ia 3.3.4. Fie d1 , d2 , . . . , dn ∈ N astfel ı̂ncât d1 ≤ d2 ≤ . . . ≤ dn , unde n ∈ N, n ≥ 2. Atunci


numerele d1 , d2 , . . . , dn sunt gradele nodurilor unui multigraf neorientat de ordinul n dacă s, i numai
P
n P
n−1
dacă suma di este un număr par s, i dn ≤ di .
i=1 i=1

P
n
Demonstrat, ie. ”⇒” Conform Propozit, iei 3.3.2 avem di = 2m, unde m este dimensiunea multigra-
i=1
fului având gradele nodurilor d1 , d2 , . . . , dn , deci suma considerată este un număr par. De asemenea,
TEMA 3. GRAFURI 36

P
n−1
avem dn = ai , unde, pentru orice i ∈ {1, . . . , n − 1}, ai reprezintă numărul de muchii de forma
i=1
P
n−1
[vn , vi ]. Cum ai ≤ di pentru orice i ∈ {1, . . . , n − 1}, rezultă că dn ≤ di .
i=1
P
n P
n−1
”⇐” Arătăm că dacă di = 2m cu m ∈ N, d1 ≤ d2 ≤ . . . ≤ dn s, i dn ≤ di , atunci există un
i=1 i=1
multigraf neorientat G = (V, E) cu V = {v1 , . . . , vn } astfel ı̂ncât dG (vi ) = di , ∀ i ∈ {1, . . . , n}.
Pentru n = 2 rezultă că d1 = d2 , deci considerând multigraful G = (V, E), cu V = {v1 , v2 } s, i
E = {e1 , . . . , em }, unde m = d1 = d2 s, i ek = [v1 , v2 ], ∀k ∈ {1, . . . , m}, iar muchiile multiple e1 , . . . , em
sunt distincte două câte două, obt, inem că dG (v1 ) = m = d1 s, i dG (v2 ) = m = d2 .
Pentru n ≥ 3 demonstrăm afirmat, ia prin induct, ie după m.
Pentru m = 0 rezultă că di = 0, ∀ i ∈ {1, . . . , n}, deci luând E = ∅ avem dG (vi ) = 0 = di ,
∀ i ∈ {1, . . . , n}.
Presupunem afirmat, ia adevărată pentru m − 1 s, i o demonstrăm pentru m, unde m ∈ N∗ . Fie
Pn P
n−1 Pn
di = 2m, d1 ≤ d2 ≤ . . . ≤ dn s, i dn ≤ di . Deoarece di = 2m ≥ 2, rezultă că dn ≥ 1. Cum
i=1 i=1 i=1
P
n−1
dn ≤ di , rezultă că s, i dn−1 ≥ 1. Fie
i=1

di , dacă 1 ≤ i ≤ n − 2,
d′i =
di − 1, dacă i ∈ {n − 1, n}.
P
n P
n
Atunci d′i = di − 2 = 2(m − 1). Avem două cazuri.
i=1 i=1
P
n−1 P
n−1
Cazul 1) dn−2 < dn . Atunci d′1 ≤ d′2 ≤ . . . ≤ d′n s, i d′n = dn − 1 ≤ di − 1 = d′i , deci, conform
i=1 i=1
ipotezei de induct, ie, există un multigraf neorientat G′ = (V, E ′ ) cu V = {v1 , . . . , vn } astfel ı̂ncât
dG′ (vi ) = d′i , ∀ i ∈ {1, . . . , n}.
Cazul 2) dn−2 = dn , deci s, i dn−1 = dn . Atunci d′1 ≤ d′2 ≤ . . . ≤ d′n−2 = dn s, i d′n−1 = d′n = dn − 1,
deci
max d′i = d′n−2.
i=1,n

P
n P
n−3 P
n−3
Avem d′i − 2d′n−2 = di + dn + (dn − 1) + (dn − 1) − 2dn = di + dn − 2 ≥ −1, deoarece dn ≥ 1.
i=1 i=1 i=1
P
n P
n
Pe de altă parte, d′i − 2d′n−2 = 2(m − 1) − 2d′n−2 , deci d′i − 2d′n−2 este un număr par. Astfel
i=1 i=1
P
n
rezultă că d′i − 2d′n−2 ≥ 0. Obt, inem că
i=1

n−3
X
max d′i = d′n−2 ≤ d′i + d′n−1 + d′n ,
i=1,n
i=1

deci, conform ipotezei de induct, ie (aplicată pentru numerele d′1 , d′2 , . . . , d′n rearanjate ı̂n ordine cres-
cătoare), rezultă din nou că există un multigraf neorientat G′ = (V, E ′ ) cu V = {v1 , . . . , vn } astfel
ı̂ncât dG′ (vi ) = d′i , ∀ i ∈ {1, . . . , n}.
În ambele cazuri, fie multigraful G = (V, E ′ ∪ {e}), unde e = [vn−1 , vn ], e 6∈ E ′ . Evident,
avem dG (vn−1 ) = dG′ (vn−1 ) + 1 = d′n−1 + 1 = dn−1, dG (vn ) = dG′ (vn ) + 1 = d′n + 1 = dn s, i
dG (vi ) = dG′ (vi ) = d′i = di pentru orice i ∈ {1, . . . , n − 2}. Astfel dG (vi ) = di , ∀ i ∈ {1, . . . , n}.
Demonstrat, ia prin induct, ie este ı̂ncheiată.
TEMA 3. GRAFURI 37

Observat, ia 3.3.3. Demonstrat, ia propozit, iei anterioare este constructivă, ea indicând un algoritm de
generare a unui multigraf neorientat cu gradele nodurilor date.
Exemplul 3.3.4. Numerele 1, 1, 1, 1, 2, 2, 3, 13 din exemplul anterior nu pot fi gradele nodurilor unui
P8 P7
multigraf neorientat, deoarece suma di = 24 este un număr par, dar d8 = 13 > 11 = di .
i=1 i=1
Exemplul 3.3.5. Numerele 1, 1, 1, 2, 4, 5, 5, 5 pot fi gradele nodurilor unui multigraf neorientat, deoarece
P
8 P7
suma di = 24 este un număr par s, i d8 = 5 ≤ 19 = di . Mai mult, conform demonstrat, iei propo-
i=1 i=1
zit, iei anterioare (partea ”⇐”), un multigraf având gradele nodurilor numerele date se construies, te
adăugând succesiv câte o muchie ı̂ntre două noduri de grade nenule maxime, grade care se mics, orează
cu 1, până când gradele devin toate egale cu zero. Acest procedeu este evident, iat ı̂n tabelul următor:
Pas Gradele rămase Muchia adăugată
1 1, 1, 1, 2, 4, 5, 5, 5 [v7 , v8 ]
2 1, 1, 1, 2, 4, 5, 4, 4 [v6 , v8 ]
3 1, 1, 1, 2, 4, 4, 4, 3 [v6 , v7 ]
4 1, 1, 1, 2, 4, 3, 3, 3 [v5 , v8 ]
5 1, 1, 1, 2, 3, 3, 3, 2 [v6 , v7 ]
6 1, 1, 1, 2, 3, 2, 2, 2 [v5 , v8 ]
7 1, 1, 1, 2, 2, 2, 2, 1 [v6 , v7 ]
8 1, 1, 1, 2, 2, 1, 1, 1 [v4 , v5 ]
9 1, 1, 1, 1, 1, 1, 1, 1 [v7 , v8 ]
10 1, 1, 1, 1, 1, 1, 0, 0 [v5 , v6 ]
11 1, 1, 1, 1, 0, 0, 0, 0 [v3 , v4 ]
12 1, 1, 0, 0, 0, 0, 0, 0 [v1 , v2 ]
– 0, 0, 0, 0, 0, 0, 0, 0 –
Multigraful obt, inut are matricea de adiacent, ă
 
0 1 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 
 
 0 0 0 1 0 0 0 0 
 
 0 0 1 0 1 0 0 0 
A=  0 0 0
.

 1 0 1 0 2 
 0 0 0 0 1 0 3 1 
 
 0 0 0 0 0 3 0 2 
0 0 0 0 2 1 2 0

Definit, ia 3.3.3. O secvent, ă (d1 , d2 , . . . , dn ) de numere naturale (n ∈ N∗ ) se numes, te secvent, ă


grafică (secvent, ă de grade, s, ir grafic, s, ir de grade) dacă există un graf neorientat simplu
G = (V, E) cu V = {v1 , v2 , . . . , vn } astfel ı̂ncât dG (vi ) = di , ∀ i ∈ {1, 2, . . . , n}.
Teorema 3.3.1 (Havel-Hakimi). Fie d1 , d2 , . . . , dn ∈ N astfel ı̂ncât d1 ≤ d2 ≤ . . . ≤ dn s, i dn ≥ 1,
unde n ∈ N, n ≥ 2. Atunci (d1 , d2, . . . , dn ) este o secvent, ă grafică dacă s, i numai dacă dn ≤ n − 1 s, i
(d1 , d2 , . . . , dn−dn −1 , dn−dn − 1, dn−dn+1 − 1, . . . , dn−1 − 1) este secvent, ă grafică.
Demonstrat, ie. ”⇒” Fie G = (V, E) un graf neorientat simplu cu V = {v1 , . . . , vn } astfel ı̂ncât
dG (vi ) = di , ∀ i ∈ {1, . . . , n}. Deoarece graful G este simplu, adică nu cont, ine nici bucle, nici
muchii multiple, rezultă că gradul dn = dG (vn ) este egal cu numărul de noduri adiacente cu vn , deci
dn ≤ n − 1. Fie M mult, imea nodurilor adiacente cu vn , deci card (M) = dn . Avem două cazuri.
TEMA 3. GRAFURI 38

Cazul 1) M = {vn−dn , vn−dn +1 , . . . , vn−1 }. Atunci graful G′ = (V ′ , E ′ ) definit prin V ′ = V \{vn } =


{v1 , . . . , vn−1 }, E ′ = E \ {[vn , x] | x ∈ M} este un graf neorientat simplu având gradele nodurilor
dG′ (vi ) = dG (vi ) = di , pentru 1 ≤ i ≤ n − dn − 1,
dG′ (vi ) = dG (vi ) − 1 = di − 1, pentru n − dn ≤ i ≤ n − 1,
deci (d1 , d2, . . . , dn−dn −1 , dn−dn − 1, dn−dn +1 − 1, . . . , dn−1 − 1) este secvent, ă grafică.
Cazul 2) M 6= {vn−dn , vn−dn +1 , . . . , vn−1 }. Fie
A = {vn−dn , vn−dn +1 , . . . , vn−1 } \ M, B = M \ {vn−dn , vn−dn +1 , . . . , vn−1 }.
Cum card ({vn−dn , vn−dn +1 , . . . , vn−1 }) = card (M) = dn , rezultă că avem card (A) = card (B) ≥ 1.
Fie r = card (A) = card (B), A = {vj1 , vj2 , . . . , vjr } s, i B = {vk1 , vk2 , . . . , vkr }, unde {j1 , j2 , . . . , jr } ⊆
{n−dn , n−dn + 1, . . . , n−1} s, i {k1 , k2 , . . . , kr } ⊆ {1, 2, . . . , n−dn −1}. Pentru orice i ∈ {1, 2, . . . , r},
cum dG (vji ) = dji ≥ dki = dG (vki ) s, i vn nu este adiacent cu vji , dar este adiacent cu vki , rezultă că
există un nod vti ∈ V care este adiacent cu vji , dar nu este adiacent cu vki . Fie graful G1 = (V, E1 )
definit prin
 [r  [ r
E1 = E \ {[vn , vki ], [vti , vji ]} ∪ {[vn , vji ], [vti , vki ]}.
i=1 i=1
Atunci G1 este un graf neorientat simplu având aceleas, i grade ale nodurilor ca s, i G, adică dG1 (vi ) =
dG (vi ) = di , pentru orice i ∈ {1, 2, . . . , n}. În plus, ı̂n graful G1 mult, imea nodurilor adiacente cu
vn este chiar mult, imea {vn−dn , vn−dn +1 , . . . , vn−1 }. Conform demonstrat, iei de la Cazul 1 (ı̂nlocuind
G cu G1 ) rezultă din nou că (d1 , d2 , . . . , dn−dn −1 , dn−dn − 1, dn−dn +1 − 1, . . . , dn−1 − 1) este secvent, ă
grafică.
”⇐” Fie dn ≤ n − 1 s, i G′ = (V ′ , E ′ ) un graf neorientat simplu cu V ′ = {v1 , . . . , vn−1 } astfel ı̂ncât
dG′ (vi ) = di , pentru 1 ≤ i ≤ n − dn − 1,
dG′ (vi ) = di − 1, pentru n − dn ≤ i ≤ n − 1.
Atunci graful G = (V, E) definit prin V = V ′ ∪ {vn } = {v1 , . . . , vn } (cu vn 6∈ V ′ ) s, i
E = E ′ ∪ {[vn , vi ] | n − dn ≤ i ≤ n − 1}
este un graf neorientat simplu având gradele nodurilor
dG (vi ) = dG′ (vi ) = di , pentru 1 ≤ i ≤ n − dn − 1,
dG (vi ) = dG′ (vi ) + 1 = di − 1 + 1 = di , pentru n − dn ≤ i ≤ n − 1,
dG (vn ) = dn ,
deci (d1 , d2, . . . , dn ) este secvent, ă grafică.
Observat, ia 3.3.4. Demonstrat, ia teoremei anterioare este constructivă, ea indicând un algoritm re-
cursiv de generare a unui graf neorientat simplu cu gradele nodurilor date.
Exemplul 3.3.6. Verificăm dacă secvent, a (1, 1, 1, 2, 4, 5, 5, 5) din exemplul anterior este secvent, ă
grafică. Conform teoremei anterioare avem echivalentele:
(1, 1, 1, 2, 4, 5, 5, 5) este secvent, ă grafică
⇔ 5 ≤ 7 s, i (1, 1, 0, 1, 3, 4, 4) este secvent, ă grafică
⇔ 4 ≤ 6 s, i (1, 0, 0, 0, 2, 3) este secvent, ă grafică
⇔ 3 ≤ 5 s, i (0, 0, 0, −1, 1) este secvent, ă grafică.
Cum ultima secvent, ă nu este o secvent, ă grafică (deoarece gradele nu pot fi negative), rezultă că nici
secvent, a init, ială nu este secvent, ă grafică.
TEMA 3. GRAFURI 39

Exemplul 3.3.7. Verificăm dacă secvent, a (1, 1, 2, 3, 4, 5, 5, 5) este secvent, ă grafică. Conform teoremei
anterioare avem echivalentele:

S1 = (1, 1, 2, 3, 4, 5, 5, 5) este secvent, ă grafică


⇔ 5 ≤ 7 s, i S2 = (1, 1, 1, 2, 3, 4, 4) este secvent, ă grafică
⇔ 4 ≤ 6 s, i S3 = (1, 1, 0, 1, 2, 3) este secvent, ă grafică
⇔ 3 ≤ 5 s, i S4 = (1, 0, 0, 0, 1) este secvent, ă grafică
⇔ 1 ≤ 4 s, i S5 = (0, 0, 0, 0) este secvent, ă grafică.

Cum ultima secvent, ă, S5 , este o secvent, ă grafică, fiind secvent, a gradelor grafului simplu de ordin
4 s, i dimensiune 0, rezultă că s, i secvent, a init, ială, S1 , este secvent, ă grafică. Mai mult, conform
demonstrat, iei teoremei amintite (partea ”⇐”), avem succesiv:

S5 = (0, 0, 0, 0) este secvent, a gradelor grafului G5 = ({v1 , . . . , v4 }, E5 ) cu E5 = ∅;


S4 = (1, 0, 0, 0, 1) este secvent, a gradelor grafului G4 = ({v1 , . . . , v5 }, E4 ) cu
E4 = E5 ∪ {[v5 , v1 ]};
S3 = (1, 1, 0, 1, 2, 3) este secvent, a gradelor grafului G3 = ({v1 , . . . , v6 }, E3 ) cu
E3 = E4 ∪ {[v6 , v2 ], [v6 , v4 ], [v6 , v5 ]};
S2 = (1, 1, 1, 2, 3, 4, 4) este secvent, a gradelor grafului G2 = ({v1 , . . . , v7 }, E2 ) cu
E2 = E3 ∪ {[v7 , v3 ], [v7 , v4 ], [v7 , v5 ], [v7 , v6 ]};
S1 = (1, 1, 2, 3, 4, 5, 5, 5) este secvent, a gradelor grafului G1 = ({v1 , . . . , v8 }, E1 ) cu
E1 = E2 ∪ {[v8 , v3 ], [v8 , v4 ], [v8 , v5 ], [v8 , v6 ], [v8 , v7 ]}.

Graful G1 este reprezentat ı̂n Figura 3.3.1.

v2 v3

v1 v4

v8 v5

v7 v6

Figura 3.3.1:
TEMA 3. GRAFURI 40

3.4 Conexitate
Definit, ia 3.4.1. Fie G = (V, E) un graf.

a) Un lant, ı̂n graful G este o succesiune alternantă

[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


că pentru orice i ∈ {1, . . . , k} ei este o muchie sau un arc având extremităt, ile vi s, i vi+1 (adică
ei = [vi , vi+1 ] pentru un graf neorientat, respectiv ei = (vi , vi+1 ) sau ei = (vi+1 , vi ) pentru un
graf orientat). Nodurile v1 s, i vk+1 se numesc extremităt, ile lant, ului, iar nodurile v2 , . . . , vk
se numesc noduri intermediare. Numărul k de muchii sau arce (nu neapărat distincte) ale
lant, ului se numes, te lungimea lant, ului.

b) Un lant, se numes, te ı̂nchis dacă are extremităt, ile egale, respectiv deschis ı̂n caz contrar.

c) Un lant, se numes, te simplu dacă muchiile sau arcele sale sunt diferite două câte două (con-
siderând diferite s, i muchiile sau arcele multiple aflate pe pozit, ii diferite ı̂n E).

d) Un lant, deschis se numes, te elementar dacă nodurile sale sunt diferite două câte două. Un
lant, ı̂nchis se numes, te elementar dacă este simplu s, i, cu except, ia extremităt, ilor, nodurile
sale sunt diferite două câte două.

e) Un ciclu este un lant, ı̂nchis s, i simplu de lungime nenulă (adică cu cel put, in o muchie sau un
arc).

f ) Un drum este un lant, [v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1 ] cu proprietatea că pentru orice i ∈ {1, . . . , k}
muchia sau arcul ei are extremitatea init, ială vi s, i extremitatea finală vi+1 (adică ei = (vi , vi+1 )
pentru graf orientat).
Un astfel de drum se notează s, i cu

(v1 , e1 , v2 , e2 , . . . , vk , ek , vk+1 ),

nodurile v1 s, i vk+1 numindu-se extremitatea init, ială, respectiv extremitatea finală a dru-
mului.

g) Un circuit este un drum ı̂nchis s, i simplu de lungime nenulă (adică un drum ce este s, i ciclu).

Observat, ia 3.4.1. Pentru grafurile neorientate not, iunile de lant, s, i de drum coincid; deci s, i not, iunile
de ciclu s, i de circuit coincid.
Observat, ia 3.4.2. Orice lant, elementar este s, i simplu.
Observat, ia 3.4.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 decât 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 ).


TEMA 3. GRAFURI 41

Exemplul 3.4.1. Pentru graful neorientat din Exemplul 3.1.1,

[1, e2 , 4, e9, 5, e4 , 2, e1 , 1, e2 , 4]

este un lant, (drum) deschis, nesimplu (cont, ine de două ori e2 ), neelementar (cont, ine de două ori 1),
de lungime 5.
În acelas, i graf, [1, e1 , 2, e3 , 2, e4 , 5, e7, 4, e9 , 5, e8 , 4, e2 , 1] este un ciclu (circuit) simplu s, i neelementar
(cont, ine de două ori 2), de lungime 7.
Pentru graful orientat simplu din Exemplul 3.1.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 (s, i lant, ) deschis elementar
(s, i simplu) de lungime 4. În acelas, i graf, (1, 2, 3, 1) este un circuit (s, i ciclu) elementar, iar [2, 5, 4, 2]
este un ciclu elementar ce nu este circuit (deoarece (4, 2) nu este arc, ci (2, 4)).

Definit, ia 3.4.2. a) Un graf (neorientat sau orientat) se numes, te conex dacă pentru orice două
noduri distincte x, y există cel put, in un lant, de la x la y.

b) Un graf orientat se numes, te tare-conex dacă pentru orice două noduri distincte x, y există cel
put, in un drum de la x la y (deci, schimbând ordinea lui x s, i y, există cel put, in un drum s, i de
la y la x).

Observat, ia 3.4.4. Orice graf tare-conex este s, i conex (deoarece orice drum este s, i lant, ). Orice graf
cu un singur nod verifică definit, ia anterioară, deci este s, i conex s, i tare-conex.
Observat, ia 3.4.5. Deoarece pentru orice nod x există lant, ul [x] s, i drumul (x) de lungimi zero, rezultă
că ı̂n definit, ia anterioară putem renunt, a la condit, iile ca nodurile x s, i y să fie distincte.
De asemenea, deoarece prin eliminarea tuturor port, iunilor dintre noduri egale dintr-un lant, sau
drum se obt, ine un lant, sau un drum elementar având aceleas, i extremităt, i, rezultă că ı̂n definit, ia
anterioară putem ı̂nlocui termenii de ”lant, ” s, i ”drum” cu ”lant, elementar”, respectiv ”drum elemen-
tar”.
Exemplul 3.4.2. Graful neorientat din Exemplul 3.1.1 nu este conex, deoarece nu există lant, uri ı̂ntre
nodurile 1 s, i 3. Graful orientat din Exemplul 3.1.2 este conex, dar nu este tare-conex, deoarece nu
există drum de la nodul 4 la nodul 1 (des, i există drum de la nodul 1 la nodul 4!).

Definit, ia 3.4.3. a) O componentă conexă a unui graf (orientat sau neorientat) G = (V, E)
este un subgraf G[U] generat de o submult, ime U ⊆ V de noduri cu proprietatea că G[U] este
conex s, i maximal cu această proprietate (ı̂n raport cu incluziunea), adică pentru orice nod
x ∈ V \ U subgraful G[U ∪ {x}] nu mai este conex.

b) O componentă tare-conexă a unui graf orientat G = (V, E) este un subgraf G[U] generat
de o mult, ime U ⊆ V de noduri cu proprietatea că G[U] este tare-conex s, i maximal cu această
proprietate (ı̂n raport cu incluziunea), adică pentru orice noduri x1 , x2 , . . . , xp ∈ V \ U subgraful
G[U ∪ {x1 , x2 , . . . , xp }] nu mai este tare-conex.

Observat, ia 3.4.6. Un graf este conex dacă s, i numai dacă are o singură componentă conexă. Un graf
orientat este tare-conex dacă s, i numai dacă are o singură componentă tare-conexă. Numărul de
componente tare-conexe ale unui graf orientat este mai mare sau egal decât numărul de componente
conexe ale acelui graf, deoarece orice componentă tare-conexă este inclusă ı̂ntr-o componentă conexă
(conform definit, iei anterioare s, i Observat, iei 3.4.4).
Observat, ia 3.4.7. Orice nod izolat x generează o componentă conexă s, i o componentă tare-conexă,
ambele având forma G[{x}] = ({x}, ∅).
TEMA 3. GRAFURI 42

Propozit, ia 3.4.1. a) Fie G[V1 ], . . . , G[Vk ] componentele conexe (diferite) ale unui graf G = (V, E).
Atunci {V1 , . . . , Vk } este o partit, ie a mult, imii V (adică 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 partit, ie a mult, imii V .

Exemplul 3.4.3. Componentele conexe ale grafului neorientat din Exemplul 3.1.1 sunt generate de
submult, imile de noduri V1 = {1, 2, 4, 5} s, i V2 = {3, 6}, deci acel graf are 2 componente conexe.
Componentele tare-conexe ale grafului orientat din Exemplul 3.1.2 sunt generate de submult, imile de
noduri V1 = {1, 2, 3}, V2 = {4} s, i V3 = {5}, deci acel graf are 3 componente tare-conexe.
Observat, ia 3.4.8. Submult, imile de muchii sau arce ale componentelor conexe ale unui graf formează de
asemenea o partit, ie a mult, imii de muchii sau arce a grafului (deoarece pentru orice muchie e = [x, y]
sau arc e = (x, y) nodurile x s, i y se află ı̂ntr-o aceeas, i componentă conexă s, i această componentă
va cont, ine s, i pe e). Afirmat, ia nu mai este valabilă pentru componentele tare-conexe. De exemplu,
pentru graful din Exemplul 3.1.2 arcul (5, 4) nu apart, ine niciunei componente tare-conexe.
Algoritmi pentru testarea conexităt, ii s, i tare-conexităt, ii unui graf, precum s, i pentru determinarea
componentelor conexe s, i tare-conexe ale unui graf, vor fi prezentat, i ı̂n sect, iunile următoare.

Definit, ia 3.4.4. a) Un arbore este un graf conex s, i fără cicluri.

b) O pădure este un graf fără cicluri.

c) Un arbore part, ial al unui graf G = (V, E) este un graf part, ial al lui G ce este arbore (adică
un arbore T = (V, F ) cu F ⊆ E).

Observat, ia 3.4.9. Arborii s, i pădurile sunt grafuri simple (deoarece orice buclă este un ciclu s, i orice
două muchii sau arce multiple formează un ciclu).
Observat, ia 3.4.10. Componentele conexe ale unei păduri sunt arbori.
Exemplul 3.4.4. Graful neorientat din Exemplul 3.1.1 nu este pădure (deoarece are cicluri), deci nici
arbore. Graful său part, ial reprezentat ı̂n Figura 3.4.1 este o pădure (având două componente conexe
arbori).

e1
1 2 3

e2 e4 e5

4 5 6

Figura 3.4.1:

Graful orientat din Exemplul 3.1.2 nu este arbore (deoarece are cicluri). Doi arbori part, iali ai săi
sunt reprezentat, i ı̂n Figurile 3.4.2 s, i 3.4.3.
TEMA 3. GRAFURI 43

1 2 1 2

5 5

3 4 3 4

Figura 3.4.2: Figura 3.4.3:

Proprietăt, ile teoretice s, i algoritmice de bază ale arborilor vor fi evident, iate ı̂n capitolul următor.

3.5 Parcurgerea grafurilor


Prin parcurgerea unui graf se ı̂nt, elege o metodă sistematică de vizitare succesivă a nodurilor sale (ı̂n
vederea prelucrării informat, iilor atas, ate ı̂n structura de date modelată prin graful dat).

Definit, ia 3.5.1. Fie G = (V, E) un graf s, i x ∈ V un nod arbitrar fixat. Parcurgerea ı̂n adâncime
(DF, ”depth first”) a grafului G pornind din nodul x, numit s, i rădăcină a acestei parcurgeri, constă
ı̂n:

• se viziteză nodul x, acesta devine nod curent;

• dacă nodul curent vi are succesori direct, i (adică noduri vj pentru care există muchie sau arc de
la vi la vj ) nevizitat, i, atunci se vizitează primul astfel de nod vj ; nodul vj devine nod curent s, i
se continuă procedeul de parcurgere pornind din acest nod;

• dacă nodul curent vj nu mai are succesori direct, i nevizitat, i, atunci se revine la nodul predecesor
direct vi (cel din care a fost vizitat); nodul vi redevine nod curent s, i se continuă procedeul de
parcurgere pornind din acest nod;

• dacă nodul curent nu mai are nici succesori direct, i nevizitat, i, nici predecesor direct (deci este
chiar radăcina x), atunci parcurgerea se ı̂ncheie.

Observat, ia 3.5.1. Pentru parcurgerea DF, considerând câte o muchie sau un arc de la fiecare nod
curent vi la primul său succesor direct nevizitat vj (care va deveni următorul nod curent) se obt, ine
un arbore, numit arbore DF.
Exemplul 3.5.1. Pentru graful din Exemplul 3.1.2, parcurgerea ı̂n adâncime pornind din nodul 2 este

DF (2) : 2, 3, 1, 4, 5

(considerând că ordinea dintre succesorii direct, i ai fiecărui nod este ordinea crescătoare). Arborele
DF corespunzător acestei parcurgeri este reprezentat ı̂n Figura 3.5.1.
TEMA 3. GRAFURI 44

2 1

3 4 5 2

1 4 5

Figura 3.5.1: Figura 3.5.2:

Pentru acelas, i graf, parcurgerea DF pornind din nodul 3 este

DF (3) : 3, 1, 2, 4, 5,

iar arborele DF corespunzător este reprezentat ı̂n Figura 3.5.2.


Prezentăm ı̂n continuare doi algoritmi, unul recursiv s, i altul nerecursiv, pentru implementarea
parcurgerii ı̂n adâncime.
Algoritmul 3.5.1 (parcurgerea DF, recursiv). Fie graful G = (V, E) având mult, imea de noduri
V = {1, . . . , n} s, i matricea de adiacent, ă A = (aij )i,j=1,n . Fie x ∈ V un nod arbitrar fixat. Pentru
implementarea parcurgerii DF (x) vom utiliza un vector V IZ având semnificat, ia

1, dacă 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 având semnificat, ia



0, dacă i = x (rădăcina),
T AT A[i] =
predecesorul direct al lui i, dacă i 6= x,

pentru orice nod i din parcurgerea DF .


Descrierea ı̂n pseudocod a algoritmului recursiv de parcurgere ı̂n adâncime pornind din nodul x
are forma
TEMA 3. GRAFURI 45

DF RECURSIV(x) :
VIZITEAZĂ(x); // se vizitează x, de exemplu se afis, ează x
V IZ[x] ← 1; // x a fost vizitat
for y = 1, n do
if (a[x, y] ≥ 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ă parcurgerea DF
// din nodul y

Algoritmul 3.5.2 (parcurgerea DF, nerecursiv). Fie din nou G = (V, E) un graf având mult, imea
de noduri V = {1, . . . , n} s, i matricea de adiacent, ă A = (aij )i,j=1,n . Fie x ∈ V un nod arbitrar
fixat. Pentru implementarea nerecursivă a parcurgerii DF (x) vom utiliza vectorii V IZ s, i T AT A cu
aceleas, i semnificat, ii ca ı̂n algoritmul anterior, un vector URM cu semnificat, ia
URM[i] = următorul succesor direct al nodului i,
s, i o structură de tip stivă S, memorată ca un vector, ce cont, ine nodurile vizitate s, i ı̂n curs de
prelucrare, adică de vizitare a tuturor succesorilor.
Descrierea ı̂n pseudocod a algoritmului are forma
DF(x) :
VIZITEAZĂ(x); // se vizitează x, de exemplu se afis, ează 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ă
i ← S[varf ]; // i este nodul din v^ arful stivei
j ← URM[i] + 1; // j va fi următorul succesor direct
// nevizitat al lui i, dacă există
while (a[i, j] = 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
// s, i ı
^l eliminăm din stivă
else
URM[i] ← j; // j este următorul succesor direct
// al lui i
if (V IZ[j] = 0) then // j nu a fost vizitat
VIZITEAZĂ(j); // se vizitează 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ă, nu mai există noduri neprelucrate,


// parcurgerea este ı^ncheiată.

Observat, ia 3.5.2. Pentru un graf cu n noduri s, i m muchii sau arce, implementarea anterioară a
parcurgerii DF are complexitatea O(n2 ), deoarece oricare din cele n noduri este vizitat (deci introdus
TEMA 3. GRAFURI 46

s, i extras din stivă) cel mult căte o dată, iar căutarea succesorilor direct, i j nevizitat, i ai fiecărui nod i
extras din stivă se efectuează ı̂n cel mult n pas, i, prin parcurgerea liniei i din matricea de adiacent, ă.
Reamintim notat, ia utilizată, pentru orice funct, ie f : N → N,

O(f ) = {g|g : N → N, ∃r > 0, ∃n0 ∈ N a.ı̂. g(n) ≤ rf (n) ∀n ≥ n0 }.

Dacă graful este memorat prin intermediul listelor de adiacent, ă, atunci cautarea succesorilor direct, i
j nevizitat, i ai fiecărui nod i extras din stivă se efectuează, prin parcurgerea lor succesivă, ı̂n exact
d(i) (pentru graf neorientat) sau d+ (i) (pentru graf orientat) pas, i. Cum, conform Propozit, iei 3.3.2,
P P +
d(x) = 2m s, i d (x) = m, obt, inem că ı̂n acest caz parcurgerea DF are complexitatea O(n+m).
x∈V x∈V

Observat, ia 3.5.3. Dacă G = (V, E) este un graf neorientat, atunci pentru orice nod x ∈ V componenta
conexă a nodului x este (indusă de) chiar mult, imea nodurilor vizitate prin parcurgerea DF (x).
Pe baza acestei observat, ii obt, inem următorul algoritm.
Algoritmul 3.5.3 (determinarea componentelor conexe). Fie din nou G = (V, E) un graf neori-
entat, V = {1, . . . , n} s, i fie A = (aij )i,j=1,n matricea de adiacent, ă a grafului G. Pentru determinarea
componentelor conexe ale grafului G vom utiliza un vector CC cu semnificat, ia

CC[i] = numărul componentei conexe ı̂n care se află nodul i,

∀ i ∈ {1, . . . , n} s, i o variabilă nrc ce reprezintă numărul de componente conexe. Evident, graful G


este conex dacă s, i numai dacă valoarea finală a variabilei nrc este egală cu 1.
Descrierea ı̂n pseudocod a algoritmului are forma
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ă componentă conexă

unde funct, ia DF(i) este cea din Algoritmul 3.5.1 sau cea din Algoritmul 3.5.2, adăugând instruc-
t, iunea CC[i] ← nrc ı̂n funct, ia VIZITEAZĂ(i).
Observat, ia 3.5.4. Algoritmul anterior poate fi utilizat s, i pentru determinarea componentelor conexe
ale unui graf orientat, ı̂nlocuind condit, ia ”axy ≥ 1” din funct, ia DF RECURSIV(x) cu ”axy ≥ 1
sau ayx ≥ 1”, respectiv condit, ia ”aij = 0” din funct, ia DF(x) cu ”aij = 0 s, i aji = 0” (deoarece ı̂n
determinarea componentelor conexe nu se t, ine cont de orientarea arcelor).
Observat, ia 3.5.5. Dacă G = (V, E) este un graf orientat, atunci pentru orice nod x ∈ V componenta
tare-conexă a nodului x este (indusă de) mult, imea nodurilor y vizitate prin parcurgerea DF (x) a
grafului G cu proprietatea că y este vizitat s, i ı̂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 s, i y sunt ı̂n aceeas, i componentă tare-conexă a lui G
dacă s, i numai dacă există un drum de la x la y ı̂n G s, i un drum de la x la y ı̂n G, adică y este vizitat
prin parcurgerea DF (x) atât ı̂n G cât s, i ı̂n G.
TEMA 3. GRAFURI 47

Matricea de adiacent, ă a grafului G este transpusa matricei de adiacent, ă a grafului G, deci pentru
parcurgerea DF (x) a grafului G putem utiliza tot matricea de adiacent, ă A a grafului dat G, ı̂nlocuind
condit, ia ”aij = 0” cu ”aji = 0”, iar condit, ia ”axy ≥ 1” cu ”ayx ≥ 1” ı̂n funct, iile DF(x), respectiv
DF RECURSIV(x). Astfel, algoritmul DF poate fi utilizat s, i pentru determinarea componentelor
tare-conexe, deci s, i pentru verificarea tare-conexităt, ii grafului.
Definit, ia 3.5.2. Fie G = (V, E) un graf s, i x ∈ V un nod arbitrar fixat. Parcurgerea ı̂n lăt, ime
(BF,”breadth first”, parcurgerea pe nivele) a grafului G pornind din nodul x, numit s, i rădăcină
a acestei parcurgeri, constă ı̂n:
• se viziteză nodul x, considerat nod de nivelul zero;
• se vizitează apoi succesorii direct, i nevizitat, i ai acestuia (diferit, i de x), considerat, i noduri de
nivelul 1;
• se vizitează apoi, pe rând, succesorii direct, i nevizitat, i ai acestora, considerat, i noduri de nivelul
2;
s, .a.m.d.;
• parcurgerea se ı̂ncheie când niciun nod de pe un nivel nu mai are succesori direct, i nevizitat, i.
Observat, ia 3.5.6. Analog parcurgerii DF, considerând câte o muchie sau un arc de la fiecare nod
curent v al parcurgerii BF la fiecare din nodurile nevizitate (de pe următorul nivel) pentru care v
este predecesorul direct, se obt, ine un arbore, numit arbore BF.
Exemplul 3.5.2. Pentru graful din Exemplul 3.1.2, parcurgerea ı̂n lăt, ime pornind din nodul 2 este
BF (2) : 2, 3, 4, 5, 1
(considerând din nou ordinea dintre succesorii direct, i ai fiecărui nod ca fiind ordinea crescătoare).
Arborele BF corespunzător acestei parcurgeri este reprezentat ı̂n Figura 3.5.3.

2 3

3 4 5 1 2

1 4 5

Figura 3.5.3: Figura 3.5.4:

Pentru acelas, i graf, parcurgerea BF pornind din nodul 3 este


BF (3) : 3, 1, 2, 4, 5,
iar arborele BF corespunzător este reprezentat ı̂n Figura 3.5.4.
TEMA 3. GRAFURI 48

Algoritmul 3.5.4 (parcurgerea BF). Fie graful G = (V, E) având mult, imea de noduri V =
{1, . . . , n} s, i matricea de adiacent, ă A = (aij )i,j=1,n . Fie x ∈ V un nod arbitrar fixat. Pentru imple-
mentarea parcurgerii BF (x) vom utiliza vectorii V IZ, T AT A, URM s, i S având aceleas, i semnificat, ii
ca la parcurgerea DF (x) (Algoritmul 3.5.2), cu deosebirea că vectorul S al nodurilor vizitate s, i ı̂n
curs de prelucrare este organizat s, i utilizat acum ca o structură de tip coadă.
Aceasta fiind singura modificare fat, ă de Algoritmul 3.5.2, obt, inem următoarea descriere ı̂n pseu-
docod a algoritmului de parcurgere ı̂n lăt, ime
BF(x) :
VIZITEAZĂ(x);
V IZ[x] ← 1;
T AT A[x] ← 0;
coada ← 1; // nodurile se adaugă la S pe pozit, ia "coada "
varf ← 1; // s, i se elimină de pe pozit, ia "varf "
S[coada] ← x;
while (varf ≤ coada) do // coada este nevidă
i ← S[varf ];
j ← URM[i] + 1;
while (a[i, j] = 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
VIZITEAZĂ(j);
V IZ[j] ← 1;
T AT A[j] ← i;
coada ← coada + 1;
S[coada] ← j;

Observat, ia 3.5.7. Analog parcurgerii DF, implementarea anterioară a parcurgerii BF are complexi-
tatea O(n2 ), iar dacă graful este memorat prin intermediul listelor de adiacent, ă, atunci complexitatea
este O(n + m).
Observat, ia 3.5.8. Observat, iile 3.5.3, 3.5.4 s, i 3.5.5 s, i algoritmii corespunzători rămân valabile dacă
ı̂nlocuim parcurgerea DF cu parcurgerea BF.

3.6 Algoritmul Roy-Warshall


Definit, ia 3.6.1. Fie G = (V, E) un graf (neorientat sau orientat), unde V = {v1 , . . . , vn }. Ma-
tricea drumurilor asociată grafului G este matricea D = (dij )i,j=1,n definită prin

1, dacă ∃ µ = (vi , . . . , vj ) drum cu l(µ) > 0,
dij =
0, ı̂n caz contrar,

unde l(µ) reprezintă lungimea drumului µ.


TEMA 3. GRAFURI 49

Exemplul 3.6.1. Matricea drumurilor asociată grafului neorientat din Exemplul 3.1.1 este
 
1 1 0 1 1 0
 1 1 0 1 1 0 
 
 0 0 1 0 0 1 
D=  1
,
 1 0 1 1 0  
 1 1 0 1 1 0 
0 0 1 0 0 1

iar matricea drumurilor asociată grafului orientat din Exemplul 3.1.2 este
 
1 1 1 1 1
 1 1 1 1 1 
 
D=  1 1 1 1 1 .
 0 0 0 0 0 
0 0 0 1 0

Observat, ia 3.6.1. Evident, orice graf neorientat are matricea drumurilor simetrică.
Observat, ia 3.6.2. Conform Observat, iei 3.4.5, pentru i 6= j putem ı̂nlocui termenul de ”drum” cu
”drum elementar” ı̂n definit, ia matricei drumurilor.
Următorul algoritm determină matricea drumurilor unui graf pornind de la matricea de adiacent, ă.
Algoritmul 3.6.1 (Roy-Warshall). Fie G = (V, E) un graf simplu cu V = {v1 , . . . , vn } s, i fie A =
(aij )i,j=1,n matricea sa de adiacent, ă (având toate elementele 0 sau 1). Se calculează matricele
(k)
D (k) = (dij )i,j=1,n, k ∈ {0, 1, . . . , n},

definite prin

D (0) = A, (3.6.1)
(k) (k−1) (k−1) (k−1)
dij = dij ∨ dik dkj , ∀k, i, j ∈ {1, . . . , n}, (3.6.2)

unde 0 ∨ 0 = 0, 0 ∨ 1 = 1 ∨ 0 = 1 ∨ 1 = 1 (operat, ia de disjunct, ie, ”sau”).


Teorema 3.6.1 (de corectitudine a Algoritmului Roy-Warshall). În contextul Algoritmului
Roy-Warshall, ultima matrice calculată este chiar matricea drumurilor asociată grafului G, adică

D (n) = D.

Demonstrat, ie. Vom demonstra prin induct, ie după k ∈ {0, 1, . . . , n} că pentru orice i, j ∈ {1, . . . , n}
avem

(k) 1, dacă ∃ µ = (vi , . . . , vj ) drum cu l(µ) > 0 s, i I(µ) ⊆ {v1 , . . . , vk },
dij = (3.6.3)
0, ı̂n caz contrar,

unde l(µ) reprezintă lungimea drumului µ, I(µ) reprezintă mult, imea nodurilor intermediare ale dru-
mului µ, iar {v1 , . . . , vk } reprezintă mult, imea {vi |, 1 ≤ i ≤ k}, deci pentru k = 0 această mult, ime
este ∅.
Pentru k = 0 avem

(0) 1, dacă (vi , vj ) ∈ E,
dij = aij (conform (3.6.1)) s, i aij =
0, ı̂n caz contrar
TEMA 3. GRAFURI 50

(din definit, ia matricei de adiacent, ă), iar (vi , vj ) ∈ E dacă s, i numai dacă ∃ µ = (vi , . . . , vj ) drum cu
l(µ) > 0 s, i I(µ) = ∅, deci obt, inem egalitatea (3.6.3).
Presupunem acum egalitatea (3.6.3) adevărată pentru k − 1 (1 ≤ k ≤ n) s, i o demonstrăm pentru
k. Folosind (3.6.2), definit, ia operat, iilor ∨ s, i · s, i ipoteza de induct, ie avem echivalent, ele:
(k) (k−1) (k−1) (k−1)
dij = 1 ⇔ dij = 1 sau dik = dkj = 1 ⇔ ∃ µ = (vi , . . . , vj ) drum cu
l(µ) > 0, I(µ) ⊆ {v1 , . . . , vk−1} sau ∃ µ1 = (vi , . . . , vk ), µ2 = (vk , . . . , vj )
drumuri cu l(µ1 ), l(µ2 ) > 0, I(µ1 ), I(µ2) ⊆ {v1 , . . . , vk−1 }
⇔ ∃ µ = (vi , . . . , vj ) cu l(µ) > 0, I(µ) ⊆ {v1 , . . . , vk }, vk 6∈ I(µ) sau
∃ µ′ = (vi , . . . , vk , . . . , vj ) cu l(µ′ ) > 0, I(µ′) ⊆ {v1 , . . . , vk }, vk ∈ I(µ′ )

(µ′ se obt, ine parcurgând ı̂ntâi µ1 apoi µ2 s, i, reciproc, µ1 , µ2 sunt port, iunile din µ′ dintre vi s, i prima
aparit, ie a lui vk ı̂n I(µ′ ), respectiv dintre ultima aparit, ie a lui vk ı̂n I(µ′ ) s, i vj )

⇔ ∃ µ = (vi , . . . , vj ) drum cu l(µ) > 0 s, i I(µ) ⊆ {v1 , . . . , vk }.

Demonstrat, ia prin induct, ie a egalităt, ii (3.6.3) este astfel ı̂ncheiată.


Pentru k = n condit, ia I(µ) ⊆ {v1 , . . . , vn } poate fi eliminată, fiind ı̂ntotdeauna adevărată, deci
din (3.6.3) s, i Definit, ia 3.6.1 obt, inem că
(n)
dij = dij , ∀ i, j ∈ {1, . . . , n},

adică egalitatea din enunt, .


Observat, ia 3.6.3. Pentru n fixat, Algoritmul Roy-Warshall necesită 2n3 operat, ii (câte o operat, ie · s, i
∨ pentru fiecare (k, i, j) ∈ {1, . . . , n} × {1, . . . , n} × {1, . . . , n}), deci acest algoritm are complexitatea
Θ(n3 ). Reamintim notat, ia utilizată, pentru orice funct, ie f : N → N,

Θ(f ) = {g|g : N → N, ∃r1 , r2 > 0, ∃n0 ∈ N a.ı̂. r1 f (n) ≤ g(n) ≤ r2 f (n) ∀n ≥ n0 }.

Observat, ia 3.6.4. Algoritmul Roy-Warshall rămâne evident valabil s, i pentru grafuri nesimple, cu
modificarea

(0) 1, dacă aij > 0,
dij = ∀ i, j ∈ {1, . . . , n}.
0, dacă aij = 0,

Exemplul 3.6.2. Pentru graful din Exemplul 3.1.2, prin aplicarea Algoritmului Roy-Warshall obt, inem
matricele:
 
0 1 0 0 0
 0 0 1 1 1 
 
D (0) = A =  1 1 0 0 0  (matricea de adiacent, ă);

 0 0 0 0 0 
0 0 0 1 0

   
0 1 0 0 0 0 1 1 1 1
 0 0 1 1 1   0 0 1 1 1 
   
D (1)
=
 1 1 0 0 0 ; D = 

(2)
 1 1 1 1 1 

 0 0 0 0 0   0 0 0 0 0 
0 0 0 1 0 0 0 0 1 0
TEMA 3. GRAFURI 51

(2) (1) (1) (1)


(deoarece, de exemplu, d13 = d13 ∨ d12 d23 = 0 ∨ 1 · 1 = 0 ∨ 1 = 1);
   
1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1    
  1 1 1 1 1 
D (3) = 
 1 1 1 1 1 ; D = 
 (4)
 1 1 1 1 1 ;

 0 0 0 0 0   0 0 0 0 0 
0 0 0 1 0 0 0 0 1 0

 
1 1 1 1 1
 1 1 1 1 1 
 
D (5)
=
 1 1 1 1 1  = D (matricea drumurilor).

 0 0 0 0 0 
0 0 0 1 0

Observat, ia 3.6.5. Conform ecuat, iilor (3.6.3), Algoritmul Roy-Warshall este un algoritm specific
metodei programării dinamice.
(k) (k−1) (k) (k−1)
Conform ecuat, iilor (3.6.2) s, i definit, iei operat, iei ∨ avem dik = dik s, i dkj = dkj , ∀ k, i, j ∈
{1, . . . , n}, deci pentru implementarea algoritmului putem utiliza o singură matrice D. Astfel obt, inem
următoarea descriere ı̂n pseudocod a algoritmului
ROY WARSHALL :
for i = 1, n do // init, ializări
for j = 1, n do
d[i, j] ← a[i, j];
for k = 1, n do
for i = 1, n do
for j = 1, n do
d[i, j] ← d[i, j] ∨ d[i, k]d[k, j];

Pentru grafuri oarecare (simple sau nesimple) init, ializarea are forma
for i = 1, n do // init, ializări
for j = 1, n do
if (a[i, j] > 0) then
d[i, j] ← 1;
else
d[i, j] ← 0;

Observat, ia 3.6.6. Dacă G = (V, E) este un graf neorientat s, i V = {1, . . . , n}, atunci pentru orice nod
x ∈ V componenta conexă a nodului x este (indusă de) mult, imea {x} ∪ {y|y ∈ V \ {x}, dxy = 1}.
Astfel Algoritmul Roy-Warshall poate fi utilizat pentru determinarea componentelor conexe s, i
pentru verificarea conexităt, ii grafului.
Algoritmul 3.6.2 (determinarea componentelor tare-conexe). Dacă G = (V, E) este un graf
orientat s, i V = {1, . . . , n}, atunci pentru orice nod x ∈ V componenta tare-conexă a nodului x este
(indusă de) mult, imea
{x} ∪ {y|y ∈ V \ {x}, dxy = dyx = 1},
deci Algoritmul Roy-Warshall poate fi utilizat pentru determinarea componentelor tare-conexe s, i
pentru verificarea tare-conexităt, ii grafului. Descrierea ı̂n pseudocod a algoritmului are forma
TEMA 3. GRAFURI 52

COMPONENTE TARE CONEXE :


nrc ← 0; // numărul de componente tare-conexe
for i = 1, n do
CT C[i] ← 0; // vectorul componentelor tare-conexe
// CT C[i] = numărul componentei tare-conexe ı ^n care se află nodul i
ROY WARSHALL;
for i = 1, n do
if (CT C[i] = 0) then
nrc ← nrc + 1;
CT C[i] ← nrc;
for j = i + 1, n do
if (CT C[j] = 0) and (d[i, j] = 1) and (d[j, i] = 1) then
CT C[j] ← nrc;
Tema 4

Arbori s, i arborescent, e

4.1 Numărul ciclomatic


Propozit, ia 4.1.1 (Dirac). Fie G = (V, E) un graf neorientat simplu s, i
δ(G) = min d(x)
x∈V

gradul minim al nodurilor din G.


a) G cont, ine un lant, deschis elementar µ astfel ı̂ncât
l(µ) ≥ δ(G),
unde l(µ) reprezintă lungimea lant, ului µ.
b) Dacă δ(G) ≥ 2, atunci G cont, ine un ciclu elementar C astfel ı̂ncât
l(C) ≥ δ(G) + 1.

Definit, ia 4.1.1. Un graf se numes, te par dacă toate nodurile sale au gradele pare.
Propozit, ia 4.1.2 (Veblen). Fie G = (V, E) un graf cu E 6= ∅. Atunci graful G este par dacă s, i
numai dacă există C1 , . . . , Ck cicluri elementare muchie-disjuncte (două câte două) astfel ı̂ncât
E = E(C1 ) ∪ · · · ∪ E(Ck ) (k ∈ N⋆ ), (4.1.1)
unde E(Ci ) reprezintă mult, imea muchiilor ciclului Ci , ∀ i ∈ {1, . . . , k}.
Propozit, ia 4.1.3. Fie G = (V, E) un graf. Atunci (P(E), ∆, ·) este un spat, iu vectorial peste corpul
finit cu două elemente (Z2 , +, ·), unde
P(E) = {F |F ⊆ E}, A∆B = (A \ B) ∪ (B \ A) (diferent, a simetrică),
b
0 · A = ∅, b
1 · A = A, ∀ A ∈ P(E).
Definit, ia 4.1.2. Spat, iul vectorial (P(E), ∆, ·) din propozit, ia anterioară se numes, te spat, iul muchi-
ilor grafului G.
Propozit, ia 4.1.4. Fie G = (V, E) un graf s, i
C(E) = {F ⊆ E|(V, F ) = graf par}.
Atunci C(E) este un subspat, iu vectorial al spat, iului muchiilor grafului G.

53
TEMA 4. ARBORI S, I ARBORESCENT, E 54

Propozit, ia 4.1.5. Fie G = (V, E) un graf s, i

C0 (E) = {F ⊆ E|∃ C = ciclu elementar ı̂n G a.ı̂. F = E(C)},

unde E(C) este mult, imea muchiilor ciclului C. Atunci subspat, iul vectorial al spat, iului muchiilor lui
G generat de C0 (E) este subspat, iul C(E) din propozit, ia anterioară.
Demonstrat, ie. Evident, C0 (E) ⊆ C(E). Conform Propozit, iei 4.1.2, pentru orice F ∈ C(E), F 6= ∅,
există F1 , . . . , Fk ∈ C0 (E) disjuncte două câte două a.ı̂. F = F1 ∪ · · · ∪ Fk , deci F = F1 ∆ . . . ∆Fk =
b
1 · F1 ∆ . . . ∆b 1 · Fk .
Definit, ia 4.1.3. Subspat, iul C(E) din Propozit, ia 4.1.4 se numes, te spat, iul ciclurilor grafului G.
Dimensiunea acestui subspat, iu se numes, te numărul ciclomatic al grafului G s, i se notează cu γ(G).
Propozit, ia 4.1.6 (Listing). Fie G = (V, E) o pădure cu n noduri, m muchii s, i k componente
conexe. Atunci
m − n + k = 0.
Demonstrat, ie. Demonstrăm egalitatea din enunt, prin induct, ie după m.
Pentru m = 0 rezultă că toate nodurile sunt izolate, deci fiecare nod formează o componentă
conexă, adică k = n s, i egalitatea m − n + k = 0 este verificată.
Presupunem adevărată egalitatea din enunt, pentru orice pădure cu m − 1 muchii (m ≥ 1) s, i o
demonstrăm pentru pădurea G cu m muchii. Fie

G′ = (V, E ′ ), unde E ′ = E \ {e}, cu e ∈ E, e = [x, y].

Evident G′ este o pădure cu n noduri, m − 1 muchii s, i k + 1 componente conexe (deoarece


componentele conexe din G ce nu cont, in x s, i y rămân componente conexe s, i ı̂n G′ , iar componenta
conexă din G ce cont, ine x s, i y se partit, ionează ı̂n două componente conexe ı̂n G′ , una cont, inând pe
x s, i cealaltă pe y). Aplicând ipoteza de induct, ie pentru graful G′ avem

(m − 1) − n + (k + 1) = 0, deci m − n + k = 0.

Corolarul 4.1.1. Orice arbore cu n noduri are m = n − 1 muchii.


Demonstrat, ie. Se aplică propozit, ia anterioară, cu k = 1.
Propozit, ia 4.1.7. Un graf este conex dacă s, i numai dacă are arbori part, iali.
Demonstrat, ie. Dacă graful G = (V, E) are un arbore part, ial T , atunci pentru orice x, y ∈ V , x 6= y,
există un lant, [x, . . . , y] ı̂n T (fiind conex), deci s, i ı̂n G, s, i astfel G este conex.
Reciproc, demonstrăm că orice graf conex G = (V, E) are arbori part, iali prin induct, ie după
numărul p de cicluri elementare ale lui G.
Pentru p = 0 rezultă că ı̂nsus, i G este un arbore, deci arbore part, ial ı̂n G.
Presupunem adevărată afirmat, ia pentru orice graf conex cu cel mult p − 1 cicluri elementare
(p ≥ 1) s, i o demonstrăm pentru graful conex G = (V, E) cu p cicluri elementare. Fie e = [x, y] o
muchie a lui G aflată pe un ciclu elementar C s, i fie G′ = (V, E \ {e}). Graful G′ rămâne conex (ı̂ntre
x s, i y există lant, ul [x, v1 , . . . , vk , y], unde [x, v1 , . . . , vk , y, x] este ciclul C) s, i are cel mult p − 1 cicluri
elementare. Conform ipotezei de induct, ie, există un arbore part, ial T ı̂n G′ , deci s, i ı̂n G.
TEMA 4. ARBORI S, I ARBORESCENT, E 55

Propozit, ia 4.1.8. Fie G = (V, E) un graf, T = (V, F ) un arbore part, ial al lui G s, i e ∈ E \ F .
Atunci graful part, ial
T + e = (V, F ∪ {e})
are un unic ciclu elementar s, i acest ciclu cont, ine muchia e.
Demonstrat, ie. Fie e = [x, y]. T fiind arbore part, ial, există un lant, elementar µ = [x, v1 , . . . , vk , y] ı̂n
T , deci µ + e = [x, v1 , . . . , vk , y, x] este un ciclu elementar ı̂n T + e.
Unicitatea acestui ciclu rezultă din unicitatea lant, ului elementar µ (dacă ar exista două lant, uri
elementare distincte µ1 = [x, . . . , y] s, i µ2 = [x, . . . , y] ı̂n T , port, iunile lor muchie-disjuncte ar produce
un ciclu, contradict, ie cu T = arbore).
Teorema 4.1.1 (Teorema numărului ciclomatic). Orice graf G = (V, E) cu n noduri, m muchii
s, i k componente conexe are numărul ciclomatic

γ(G) = m − n + k.

Demonstrat, ie. Demonstrăm egalitatea din enunt, ı̂n două etape.


Etapa 1) Presupunem că graful G este conex, deci k = 1. Fie T = (V, F ) un arbore part, ial al lui
G (există, conform Propozit, iei 4.1.7). Conform Corolarului 4.1.1, card (F ) = n − 1. Fie

E \ F = {e1 , . . . , em−n+1 }.

Pentru orice i ∈ {1, . . . , m − n + 1}, fie Ci mult, imea muchiilor ciclului elementar unic din T + ei
(conform Propozit, iei 4.1.8). Atunci

B = {C1 , . . . , Cm−n+1 }

este o bază a spat, iului ciclurilor C(E) (numită bază de cicluri a grafului G). Rezultă că

γ(G) = card (B) = m − n + 1 = m − n + k.

Etapa 2) Fie acum G un graf oarecare s, i G1 , . . . , Gk componentele sale conexe. Fie ni s, i mi


numerele de noduri, respectiv muchii ale componentei Gi . Evident, n = n1 + · · · + nk s, i m =
m1 + · · · + mk .
Deoarece subspat, iile ciclurilor componentelor G1 , . . . , Gk sunt liniar independente, avem

γ(G) = γ(G1 ) + · · · + γ(Gk ).

Dar, conform etapei 1), γ(Gi ) = mi − ni + 1 ∀ i ∈ {1, . . . , k}, s, i astfel prin adunare rezultă că
γ(G) = m − n + k.
Observat, ia 4.1.1. Demonstrat, ia teoremei anterioare este constructivă, indicând următorul algoritm
de determinare a unei baze de cicluri pentru graful G:

• se determină componentele conexe G1 , . . . , Gk ;

• pentru fiecare componentă Gi , se determină un arbore part, ial T (de exemplu arborele DF sau
BF ) s, i ciclurile elementare C1 , . . . , Cmi −ni +1 din grafurile T + ei , pentru fiecare muchie ei din
Gi ce nu apart, ine lui T ;

• ciclurile astfel determinate formează ı̂mpreună o bază de cicluri pentru graful G.


TEMA 4. ARBORI S, I ARBORESCENT, E 56

Exemplul 4.1.1. Fie graful G reprezentat ı̂n Figura 4.1.1.

1 2 3

4 5 6

Figura 4.1.1:

Numărul său ciclomatic este γ(G) = m − n + k = 9 − 7 + 1 = 3.


Considerăm arborele part, ial T reprezentat ı̂n Figura 4.1.2.

1 2 3

4 5 6

Figura 4.1.2:

Aplicând algoritmul din observat, ia anterioară se obt, ine baza de cicluri {C1 , C2 , C3 } unde

C1 = {[1, 4], [4, 2], [2, 1]}, C2 = {[4, 5], [5, 2], [2, 4]} s, i C3 = {[5, 6], [6, 3], [3, 2], [2, 5]}.

4.2 Teorema de caracterizare a arborilor


Teorema 4.2.1 (de caracterizare a arborilor). Fie G = (V, E) un graf cu n noduri. Următoarele
afirmat, ii sunt echivalente:

1) G este un arbore (adică este conex s, i fără cicluri);

2) G este fără cicluri s, i are m = n − 1 muchii;

3) G este conex s, i are m = n − 1 muchii;

4) G este fără cicluri s, i maximal cu această proprietate, adică dacă se adaugă o muchie ı̂ntre
oricare două noduri graful obt, inut cont, ine cicluri;

5) G este conex s, i minimal cu această proprietate, adică dacă se elimină o muchie oarecare graful
obt, inut devine neconex;

6) ı̂ntre oricare două noduri ale lui G există un unic lant, elementar.
TEMA 4. ARBORI S, I ARBORESCENT, E 57

Demonstrat, ie. 1) ⇒ 2) Fie G un arbore, adică s, i conex s, i fără cicluri. Deci 0 = γ(G) = m − n + 1 s, i
astfel m = n − 1.
2) ⇒ 3) Fie G fără cicluri s, i cu m = n − 1 muchii. Avem 0 = γ(G) = n − 1 − n + k, unde k
reprezintă numărul de componente conexe ale lui G, deci k = 1, adică G este conex.
3) ⇒ 4) Fie G conex s, i cu m = n − 1 muchii. Avem γ(G) = n − 1 − n + 1 = 0, deci G este fără
cicluri. Fie G + e = (V, E ∪ {e}), e 6∈ E. Graful G + e rămâne conex s, i are n noduri s, i m + 1 = n
muchii. Astfel γ(G + e) = n − n + 1 = 1, adică G + e cont, ine un ciclu (elementar).
4) ⇒ 5) Fie G fără cicluri maximal. Dacă G nu ar fi conex, atunci adăugând o muchie ı̂ntre două
noduri x s, i y din componente conexe diferite ale lui G s-ar obt, ine un graf fără cicluri (deoarece nu
există lant, ı̂ntre x s, i y ı̂n G), contradict, ie cu ipoteza. Deci G este conex.
Fie G − e = (V, E \ {e}), e ∈ E, e = [x, y]. Dacă graful G − e ar fi conex, atunci ar exista un
lant, elementar [x, v1 , . . . , vk , y] ı̂n G − e s, i astfel [x, v1 , . . . , vk , y, x] ar fi un ciclu ı̂n G, contradict, ie cu
ipoteza. Deci G − e este neconex.
5) ⇒ 6) Fie G conex minimal. Fie x, y ∈ V .
Dacă x 6= y, rezultă că există un lant, elementar [x, . . . , y].
Dacă x = y există de asemenea lant, ul elementar [x] de lungime zero.
Dacă ı̂ntre nodurile x s, i y ar exista două lant, uri elementare distincte µ1=[x = v1 , v2 , . . . , vi = y]
s, i µ2 = [x = w1 , w2 , . . . , wj = y], atunci notând cu e = [vk , vk+1 ] prima muchie a lant, ului µ1 ce nu
apart, ine lant, ului µ2 , graful G − e = (V, E \ {e}) ar rămâne conex (deoarece ı̂ntre vk s, i vk+1 avem
lant, ul [vk , vk−1 , . . . , v1 = x = w1 , w2, . . . , wj = y = vi , vi−1 , . . . , vk+1 ]), contradict, ie cu ipoteza. Deci
ı̂ntre x s, i y există un unic lant, elementar.
6) ⇒ 1) Fie G cu proprietatea că ı̂ntre orice două noduri există un unic lant, elementar. Evident,
G este conex. Dacă G ar avea un ciclu elementar C = [x, v1 , . . . , vk , x] atunci [x, v1 ] s, i [v1 , . . . , vk , x]
ar fi două lant, uri elementare ı̂ntre x s, i v1 , contradict, ie cu ipoteza. Deci G nu are cicluri elementare,
s, i nici neelementare (deoarece orice ciclu neelementar s-ar descompune ı̂n cicluri elementare muchie-
disjuncte).
Observat, ia 4.2.1. Un arbore de ordinul 1 este format dintr-un singur nod izolat (de grad zero), iar
arbore de ordin n ≥ 2 nu are noduri izolate (fiind conex), deci are gradele nodurilor mai mari sau
egale cu 1.
Propozit, ia 4.2.1 (de caracterizare a secvent, ei gradelor nodurilor unui arbore). Fie d1 , d2 ,
. . ., dn ∈ N∗ , unde n ∈ N, n ≥ 2. Atunci numerele d1 , d2 , . . . , dn sunt gradele nodurilor unui arbore
de ordinul n dacă s, i numai dacă
Xn
di = 2n − 2.
i=1

Demonstrat, ie. ”⇒” Fie T = (V, E) un arbore cu V = {v1 , . . . , vn } astfel ı̂ncât dT (vi ) = di , ∀ i ∈
{1, . . . , n}. Conform Corolarului 4.1.1 rezultă că T are m = n − 1 muchii, deci aplicând Propozit, ia
3.3.2 avem n
X
di = 2m = 2n − 2.
i=1
P
n
”⇐” Demonstrăm că dacă di = 2n − 2 cu d1 , d2 , . . . , dn ∈ N∗ , n ∈ N, n ≥ 2, atunci există un
i=1
arbore T = (Vn , E) cu Vn = {v1 , . . . , vn } astfel ı̂ncât dT (vi ) = di , ∀ i ∈ {1, . . . , n}, prin induct, ie după
n.
Pentru n = 2 rezultă că d1 + d2 = 2, deci d1 = d2 = 1. Luând E = {[v1 , v2 ]} rezultă că
T = ({v1 , v2 }, E) este un arbore (fiind conex s, i având 2 − 1 = 1 muchii) s, i dT (vi ) = 1 = di ,
∀ i ∈ {1, 2}.
TEMA 4. ARBORI S, I ARBORESCENT, E 58

Presupunem afirmat, ia adevărată pentru n − 1 s, i o demonstrăm pentru n, unde n ∈ N, n ≥ 3.


Pn
Fie di = 2n − 2, d1 , d2 , . . . , dn ∈ N∗ . Presupunem că d1 ≥ d2 ≥ . . . ≥ dn . Atunci dn = 1 (deoarece
i=1
P
n
dacă dn ≥ 2 ar rezulta că di ≥ 2n > 2n − 2, fals) s, i d1 ≥ 2 (deoarece dacă d1 = 1 ar rezulta că
i=1
P
n
di = n < 2n − 2, fals). Fie
i=1

d1 − 1, dacă i = 1,
d′i =
di , dacă i ∈ {2, . . . , n − 1}.

Atunci d′1 , d′2 , . . . , d′n−1 ∈ N∗ s, i


n−1
X n−1
X n
X
d′i = d1 − 1 + di = di − 2 = 2n − 4 = 2(n − 1) − 2,
i=1 i=2 i=1

deci, conform ipotezei de induct, ie, există un arbore T ′ = (Vn−1 , E ′ ) cu Vn−1 = {v1 , . . . , vn−1 } astfel
ı̂ncât dT ′ (vi ) = d′i , ∀ i ∈ {1, . . . , n − 1}. Fie graful

T = (Vn , E ′ ∪ {[v1 , vn ]}),

unde Vn = {v1 , . . . , vn }, cu vn 6∈ Vn−1 . Cum T ′ este conex si are n − 1 − 1 = n − 2 muchii, rezultă că
s, i T este conex (nodul nou, vn , este adiacent cu v1 ) s, i are n − 2 + 1 = n − 1 muchii, deci s, i T este
un arbore. Avem dT (v1 ) = dT ′ (v1 ) + 1 = d′1 + 1 = d1 , dT (vn ) = 1 = dn s, i dT (vi ) = dT ′ (vi ) = d′i = di
pentru orice i ∈ {2, . . . , n − 1}. Astfel dT (vi ) = di , ∀ i ∈ {1, . . . , n}.
Demonstrat, ia prin induct, ie este ı̂ncheiată.
Observat, ia 4.2.2. Demonstrat, ia propozit, iei anterioare este constructivă, ea indicând un algoritm de
generare a unui arbore cu gradele nodurilor date.
Exemplul 4.2.1. Numerele 1, 1, 2, 3, 4, 5, 5, 5 din Exemplul 3.3.7 nu pot fi gradele nodurilor unui ar-
P8
bore, deoarece suma di = 26 6= 2 · 8 − 2.
i=1
Exemplul 4.2.2. Numerele 1, 1, 1, 1, 1, 2, 3, 4 pot fi gradele nodurilor unui arbore, deoarece suma
P8
di = 14 = 2 · 8 − 2. Mai mult, conform demonstrat, iei propozit, iei anterioare (partea ”⇐”),
i=1
un arbore având gradele nodurilor numerele date se construies, te adăugând succesiv câte o muchie
ı̂ntre un nod de grad maxim s, i un nod de grad 1, grade care se mics, orează cu 1, până când gradele
devin toate egale cu zero. Acest procedeu este evident, iat ı̂n tabelul următor:
Pas Gradele rămase Muchia adăugată
1 1, 1, 1, 1, 1, 2, 3, 4 [v8 , v1 ]
2 0, 1, 1, 1, 1, 2, 3, 3 [v8 , v2 ]
3 0, 0, 1, 1, 1, 2, 3, 2 [v7 , v3 ]
4 0, 0, 0, 1, 1, 2, 2, 2 [v8 , v4 ]
5 0, 0, 0, 0, 1, 2, 2, 1 [v7 , v5 ]
6 0, 0, 0, 0, 0, 2, 1, 1 [v6 , v7 ]
7 0, 0, 0, 0, 0, 1, 0, 1 [v8 , v6 ]
– 0, 0, 0, 0, 0, 0, 0, 0 –
Arborele obt, inut este reprezentat ı̂n Figura 4.2.1.
TEMA 4. ARBORI S, I ARBORESCENT, E 59

v2 v3

v1 v4

v8 v5

v7 v6

Figura 4.2.1:

4.3 Teorema de caracterizare a arborescent, elor


Definit, ia 4.3.1. Fie G = (V, E) un graf orientat. Un nod x ∈ V se numes, te rădăcină a grafului
G dacă pentru orice nod y ∈ V \ {x} există cel put, in un drum de la x la y.
Exemplul 4.3.1. În graful din Exemplul 3.1.2 nodurile 1, 2 s, i 3 sunt rădăcini, iar nodurile 4 s, i 5 nu
sunt rădăcini.
Definit, ia 4.3.2. a) O arborescent, ă este un arbore care are o rădăcină.

b) O arborescent, ă part, ială a unui graf orientat G = (V, E) este un graf part, ial al lui G ce este
arborescent, ă (adică o arborescent, ă T = (V, F ) cu F ⊆ E).
Exemplul 4.3.2. Graful din Exemplul 3.1.2 nu este arborescent, ă (are cicluri, deci nu este arbore).
Două arborescent, e part, iale ale sale sunt reprezentate ı̂n Figurile 4.3.1 s, i 4.3.2.

1 2 1 2

5 5

3 4 3 4

Figura 4.3.1: Figura 4.3.2:

Definit, ia 4.3.3. Un graf orientat G = (V, E) se numes, te quasi-tare conex dacă pentru orice două
noduri x, y ∈ V există un nod z ∈ V s, i drumuri de la z la x s, i de la z la y.
Observat, ia 4.3.1. Ca s, i ı̂n definit, iile conexităt, ii s, i tare-conexităt, ii, s, i ı̂n Definit, iile 4.3.1 s, i 4.3.3 putem
ı̂nlocui termenul de ”drum” cu ”drum elementar” (conform Observat, iei 3.4.5).
TEMA 4. ARBORI S, I ARBORESCENT, E 60

Observat, ia 4.3.2. Evident, orice graf quasi-tare conex este conex. Reciproca nu este adevărată. De
exemplu, graful reprezentat ı̂n Figura 4.3.3 este conex, dar nu este quasi-tare conex (pentru nodurile
x = 1 s, i y = 4 nu există noduri z din care să avem drumuri la x s, i la y).

1 2

3 4

Figura 4.3.3:

Observat, ia 4.3.3. Orice graf tare-conex este quasi-tare conex (deoarece pentru orice noduri x, y luând
z = x există drumuri (z, . . . , x) s, i (z, . . . , y)). Reciproca nu este adevărată. De exemplu, graful din
Exemplul 3.1.2 este quasi-tare conex, dar nu este tare-conex.
Propozit, ia 4.3.1. Un graf orientat este quasi-tare conex dacă s, i numai dacă are (cel put, in) o
rădăcină.
Demonstrat, ie. ”⇒” Fie G = (V, E) un graf quasi-tare conex, V = {v1 , . . . , vn }. Demonstrăm prin
induct, ie după k ∈ {1, . . . , n} că există un nod xk ∈ V cu drumuri (xk , . . . , v1 ), (xk , . . . , v2 ), . . . , (xk , . . . , vk ).
Pentru k = 1 luăm x1 = v1 .
Presupunem adevărată afirmat, ia pentru k − 1 s, i o demonstrăm pentru k. Deoarece graful este
quasi-tare conex, rezultă că există un nod xk ∈ V cu drumuri (xk , . . . , xk−1 ) s, i (xk , . . . , vk ). Conform
ipotezei de induct, ie, există drumuri (xk−1 , . . . , v1 ), . . . , (xk−1 , . . . , vk−1 ), deci există drumuri

(xk , . . . , xk−1 , . . . , v1 ), . . . , (xk , . . . , xk−1 , . . . , vk−1), (xk , . . . , vk ).

Demonstrat, ia prin induct, ie este ı̂ncheiată.


Luând k = n, nodul xn este o rădăcină a grafului G.
”⇐” Fie G = (V, E) s, i z ∈ V o rădăcină a lui G. Pentru orice noduri x, y ∈ V există drumuri
(z, . . . , x) s, i (z, . . . , y), deci G este quasi-tare conex.
Teorema 4.3.1 (de caracterizare a arborescent, elor). Fie G = (V, E) un graf orientat cu n
noduri. Următoarele afirmat, ii sunt echivalente:

1) G este quasi-tare conex s, i fără cicluri;

2) G este quasi-tare conex s, i are m = n − 1 arce;

3) G este o arborescent, ă (adică arbore cu rădăcină);

4) există un nod x ∈ V astfel ı̂ncât pentru orice nod v ∈ V există un unic drum de la x la v;

5) G este quasi-tare conex s, i minimal cu această proprietate, adică dacă se elimină un arc oarecare
graful obt, inut nu mai este quasi-tare conex;

6) G este conex s, i există un nod x ∈ V astfel ı̂ncât d− (x) = 0 s, i d− (v) = 1 ∀ v ∈ V \ {x};


TEMA 4. ARBORI S, I ARBORESCENT, E 61

7) G este fără cicluri s, i există un nod x ∈ V astfel ı̂ncât d− (x) = 0 s, i d− (v) = 1 ∀ v ∈ V \ {x}.
Demonstrat, ie. 1) ⇒ 2) Fie G quasi-tare conex s, i fără cicluri. Fiind quasi-tare conex, G este conex.
Deci G este un arbore s, i astfel are m = n − 1 arce (conform Teoremei de caracterizare a arborilor).
2) ⇒ 3) Fie G quasi-tare conex s, i cu m = n − 1 arce. Fiind quasi-tare conex, G este conex s, i are
rădăcină (conform propozit, iei anterioare). Fiind conex cu m = n − 1 arce, G este arbore (conform
teoremei amintite mai sus).
3) ⇒ 4) Fie G arborescent, ă s, i x o rădăcină a lui G. Deci pentru orice nod v ∈ V există un drum
de la x la v. Graful G fiind un arbore, acest drum, fiind s, i lant, , este unic.
4) ⇒ 5) Fie G cu proprietatea 4). Deci x este o rădăcină a lui G s, i astfel G este quasi-tare
conex (conform propozit, iei anterioare). Fie e = (y, z) ∈ E un arc arbitrar fixat. Demonstrăm că
G − e = (V, E \ {e}) nu este quasi-tare conex prin reducere la absurd. Dacă G − e ar fi quasi-tare
conex, atunci ar exista un nod v ∈ V s, i drumuri (v, . . . , y) s, i (v, . . . , z) ı̂n G − e. x fiind rădăcină
ı̂n G, s-ar obt, ine două drumuri distincte (x, . . . , v, . . . , y, z) s, i (x, . . . , v, . . . , z) de la x la z ı̂n G,
contradict, ie cu ipoteza.
5) ⇒ 6) Fie G quasi-tare conex minimal. Fiind quasi-tare conex, G este conex. Conform
propozit, iei anterioare, G are o rădăcină x. Demonstrăm că d− (x) = 0 prin reducere la absurd.
Dacă am avea d− (x) > 0, atunci ar exista un arc e = (y, x) ∈ E, iar G − e ar avea ı̂n continuare
rădăcina x (deoarece există drum elementar (x, . . . , y) ı̂n G, deci s, i ı̂n G − e) s, i astfel G − e ar rămâne
quasi-tare conex (conform propozit, iei anterioare), contradict, ie cu ipoteza.
Fie acum v ∈ V \ {x} un nod arbitrar fixat. x fiind rădăcină, există un drum (x, . . . , y, v) de
lungime nenulă (v 6= x), deci d− (v) ≥ 1 (∃(y, v) ∈ E). Demonstrăm că d− (v) = 1 prin reducere la
absurd. Dacă am avea d− (v) > 1, atunci ar exista două arce diferite e1 = (y1, v),e2 = (y2 , v) ∈ E, iar
G − e1 ar avea ı̂n continuare rădăcina x (deoarece există un drum (x, . . . , y2 , v) ı̂n G − e1 ) s, i astfel
G − e1 ar rămâne quasi-tare conex (conform propozit, iei anterioare), contradict, ie cu ipoteza.
P −
6) ⇒ 7) Fie G cu proprietatea 6). Conform Propozit, iei 3.3.2, m = d (t) = n − 1, deci G este
t∈V
un arbore (conform Teoremei de caracterizare a arborilor) s, i astfel nu are cicluri.
P −
7) ⇒ 1) Fie G cu proprietatea 7). Din nou, m = d (t) = n − 1, deci G este un arbore s, i astfel
t∈V
este conex. Rezultă că pentru orice nod y ∈ V există un lant, elementar unic [x, v1 , . . . , vk , y].
Deoarece d− (x) = 0 nu putem avea (v1 , x) ∈ E, deci (x, v1 ) ∈ E. Cum (x, v1 ) ∈ E s, i d− (v1 ) = 1,
nu putem avea (v2 , v1 ) ∈ E, deci (v1 , v2 ) ∈ E.
Continuând ı̂n acest mod (induct, ie!) obt, inem (v2 , v3 ) ∈ E, . . . , (vk , y) ∈ E, deci lant, ul [x, v1 , . . . , vk , y]
este un drum de la x la y.
Rezultă că x este o rădăcină ı̂n G s, i astfel, conform propozit, iei anterioare, G este quasi-tare
conex.
Corolarul 4.3.1. Orice arborescent, ă G = (V, E) are o unică rădăcină x s, i aceasta verifică pro-
prietăt, ile 4), 6) s, i 7) din teorema anterioară.
Demonstrat, ie. Concluzia rezultă imediat din demonstrat, ia teoremei anterioare.

4.4 Numărarea arborilor part, iali


Definit, ia 4.4.1. Fie G = (V, E) un graf fără bucle, unde V = {v1 , . . . , vn }. Matricea de
admitant, ă (matricea gradelor) asociată grafului G este matricea M = (mij )i,j=1,n definită prin:
mii = dG (vi ), ∀ i ∈ {1, . . . , n};
−mij = numărul de muchii sau arce dintre nodurile vi s, i vj , ∀ i, j ∈ {1, . . . , n}, i 6= j.
TEMA 4. ARBORI S, I ARBORESCENT, E 62

Exemplul 4.4.1. Fie G graful reprezentat ı̂n Figura 4.4.1.

1 2

3 4

Figura 4.4.1:

Matricea de admitant, ă a acestui graf este


 
2 −1 −1 0 0
 −1 5 −2 −1 −1 
 
M =  −1 −2 4 −1 0 .

 0 −1 −1 2 0 
0 −1 0 0 1

Observat, ia 4.4.1. Matricea de admitant, ă este o matrice simetrică (s, i pentru grafuri orientate!) s, i are
toate sumele pe linii s, i pe coloane egale cu zero.
Observat, ia 4.4.2. Definit, ia 4.4.1 se poate extinde s, i pentru grafuri cu bucle, considerând drept matrice
de admitant, ă a unui astfel de graf matricea de admitant, ă a grafului obt, inut prin eliminarea tuturor
buclelor.
Teorema 4.4.1 (Kirchoff-Trent, de numărare a arborilor part, iali). Fie G = (V, E) un graf
fără bucle având matricea de admitant, ă M = (mij )i,j=1,n , n ≥ 2. Atunci numărul t(G) de arbori
part, iali ai grafului G verifică egalitatea

t(G) = (−1)i+j det[M]ij , ∀ i, j ∈ {1, . . . , n},

unde [M]ij reprezintă matricea obt, inută din M prin eliminarea liniei i s, i coloanei j.
Observat, ia 4.4.3. Teorema anterioară este valabilă s, i pentru grafuri cu bucle, folosind Observat, ia
4.4.2.
Exemplul 4.4.2. Aplicând teorema anterioară rezultă că numărul arborilor part, iali ai grafului G din
Exemplul 4.4.1 este

2 −1 0 0

−1 4 −1 0
t(G) = det[M]22 = = 12.

0 −1 2 0
0 0 0 1

Definit, ia 4.4.2. a) Graful neorientat simplu Kn = (V, E) definit prin

V = {v1 , . . . , vn }, E = {[vi , vj ]|i, j ∈ {1, . . . , n}, i 6= j}

se numes, te graf complet de ordinul n, unde n ∈ N⋆ .


TEMA 4. ARBORI S, I ARBORESCENT, E 63

b) Graful neorientat simplu Kp,q = (V, E) definit prin


V = {x1 , . . . , xp , y1, . . . , yq }, E = {[xi , yj ]|i ∈ {1, . . . , p}, j ∈ {1, . . . , q}}
se numes, te graf bipartit complet, unde p, q ∈ N⋆ .
În particular, un graf bipartit complet de forma K1,q se numes, te graf stea.
Exemplul 4.4.3. Graful complet K6 este reprezentat ı̂n Figura 4.4.2.

2 3

1 4

6 5

Figura 4.4.2:

Graful bipartit complet K3,2 este reprezentat ı̂n Figura 4.4.3 ({x1 , x2 , x3 } = {1, 2, 3} s, i {y1 , y2 } =
{4, 5}), iar graful stea K1,6 este reprezentat ı̂n Figura 4.4.4 (x1 = 1 s, i {y1, . . . , y6 } = {2, . . . , 7}).

1 3 4

2 2 1 5

3 7 6

Figura 4.4.3: Figura 4.4.4:

Corolarul 4.4.1. Graful complet Kn are nn−2 arbori part, iali.


Demonstrat, ie. Matricea de admitant, ă a grafului Kn este
 
n − 1 −1 . . . −1
 −1 n − 1 . . . −1 
M =  ...
 ( de tipul n × n),
... ... ... 
−1 −1 . . . n − 1
deci conform teoremei anterioare avem

n − 1 −1 ... −1

−1 n − 1 ... −1
t(Kn ) = det[M]11 =

... ... ... ...
−1 −1 ... n− 1
TEMA 4. ARBORI S, I ARBORESCENT, E 64

(determinant de ordinul n − 1). Adunând toate liniile la prima linie, apoi adunând linia obt, inută la
celălalte linii obt, inem

1 1 ... 1 1 1 . . . 1

−1 n − 1 . . . −1 0 n . . . 0
t(Kn ) = n−2
... ... ... ... = n .
=
. . . . . . . . . . . .
−1 −1 . . . n − 1 0 0 ... n

Observat, ia 4.4.4. Corolarul anterior poate fi reformulat astfel: numărul arborilor ce pot fi construit, i
cu n noduri date (numit, i s, i arbori etichetat, i) este egal cu nn−2 .
Corolarul 4.4.2. Graful bipartit complet Kp,q are pq−1 q p−1 arbori part, iali.

4.5 Numărarea arborescent, elor part, iale


Definit, ia 4.5.1. Fie G = (V, E) un graf orientat fără bucle, unde V = {v1 , . . . , vn }. Matricea
gradelor de intrare asociată grafului G este matricea M = (mij )i,j=1,n definită prin:

mii = d−
G (vi ), ∀ i ∈ {1, . . . , n};

−m−
ij = numărul de arce de la nodul vi la nodul vj , ∀ i, j ∈ {1, . . . , n}, i 6= j.

Exemplul 4.5.1. Pentru graful orientat G din Examplul 3.1.2, matricea gradelor de intrare este
 
1 −1 0 0 0
 0 2 −1 −1 −1 
 
M =  −1 −1 1 0 0 
.
 0 0 0 2 0 
0 0 0 −1 1

Observat, ia 4.5.1. Matricea gradelor de intrare are toate sumele pe coloane egale cu zero.
Observat, ia 4.5.2. Definit, ia 4.5.1 se poate extinde s, i pentru grafuri orientate cu bucle, considerând
drept matrice a gradelor de intrare a unui astfel de graf matricea gradelor de intrare a grafului obt, inut
prin eliminarea tuturor buclelor.
Teorema 4.5.1 (de numărare a arborescent, elor part, iale). Fie G = (V, E) un graf orientat
fără bucle cu V = {v1 , . . . , vn }, n ≥ 2, s, i fie M = (mij )i,j=1,n matricea gradelor de intrare asociată
grafului G.

a) Pentru orice nod vi ∈ V , numărul de arborescent, e part, iale ale grafului G ce au ca rădăcină
nodul vi este egal cu
det[M ]ii
(unde [M ]ii reprezintă matricea obt, inută din M prin eliminarea liniei i s, i coloanei i).

b) Numărul total de arborescent, e part, iale ale grafului G este egal cu


n
X
det[M ]ii .
i=1
TEMA 4. ARBORI S, I ARBORESCENT, E 65

Observat, ia 4.5.3. Teorema anterioară este valabilă s, i pentru grafuri cu bucle, folosind Observat, ia
4.5.2.
Exemplul 4.5.2. Aplicând teorema anterioară pentru graful G din Exemplul 3.1.2 rezultă că numărul
arborescent, elor part, iale având rădăcina 1 este egal cu

2 −1 −1 −1

−1 1 0 0
det[M ]11 = = 2.
0 0 2 0
0 0 −1 1

Numărul total de arborescent, e part, iale ale grafului G este egal cu

det[M ]11 + det[M ]22 + det[M ]33 + det[M ]44 + det[M ]55
= 2 + 2 + 4 + 0 + 0 = 8.
Tema 5

Arbori part, iali de cost minim

Problema determinării arborilor part, iali de cost minim are numeroase aplicat, ii practice. În continuare
vom prezenta doi algoritmi fundamentali pentru rezolvarea acestei probleme.

5.1 Expunerea problemei


Definit, ia 5.1.1. Un graf ponderat este o pereche (G, c), unde G = (V, E) este un graf iar c : E →
R este o funct, ie numită pondere (cost). Pentru orice e ∈ E, c(e) se numes, te ponderea (costul)
muchiei sau arcului e.
Definit, ia 5.1.2. Fie (G, c) un graf ponderat, G = (V, E).

a) Dacă H = (U, F ) este un subgraf al lui G, atunci costul (ponderea) lui H este
X
c(H) = c(e)
e∈F

(adică suma costurilor muchiilor sau arcelor sale).

b) Un arbore part, ial T ⋆ = (V, F ) al lui G cu proprietatea că

c(T ⋆ ) = min{c(T )|T = arbore part, ial al lui G}

se numes, te arbore part, ial de cost minim (APM) al grafului ponderat (G, c).

Observat, ia 5.1.1. Conform Propozit, iei 4.1.7, un graf ponderat are arbori part, iali de cost minim dacă
s, i numai dacă este conex.
Observat, ia 5.1.2. Pentru un graf ponderat conex dat, arborele part, ial de cost minim nu este neapărat
unic. De exemplu, graful ponderat din Figura 5.1.1 are 4 arbori part, iali de cost minim, reprezentat, i
ı̂n Figurile 5.1.2–5.1.5.

66
TEMA 5. ARBORI PART, IALI DE COST MINIM 67

30 40
1 2 3

10 20 10

4 5 6
30 40

Figura 5.1.1:

30 40 1 2 3
1 2 3

10 20 10 10 20 10

4 5 6 4 5 6
30 40

Figura 5.1.2: Figura 5.1.3:

30 40
1 2 3 1 2 3

10 20 10 10 20 10

4 5 6 4 5 6
40 30

Figura 5.1.4: Figura 5.1.5:

În cazul ı̂n care costurile muchiilor sunt diferite două câte două avem următorul rezultat.
Propozit, ia 5.1.1. Un graf ponderat conex având costurile muchiilor diferite două câte două are un
unic arbore part, ial de cost minim.
Demonstrat, ie. Fie (G, c) un graf ponderat conex cu G = (V, E), astfel ı̂ncât c(e1 ) 6= c(e2 ) pentru
orice e1 6= e2 , e1 , e2 ∈ E. Demonstrăm că acest graf are un unic APM prin reducere la absurd.
Presupunem că există doi arbori part, iali de cost minim T1 = (V, F1 ) s, i T2 = (V, F2 ). Fie f =
[x, y] ∈ E astfel ı̂ncât
c(f ) = min{c(e) | e ∈ F1 ∆F2 }, (5.1.1)
unde F1 ∆F2 = (F1 \ F2 ) ∪ (F2 \ F1 ) este diferent, a simetrică a mult, imilor F1 s, i F2 . Analizăm cazul
f ∈ F1 \ F2 (cazul f ∈ F2 \ F1 fiind analog).
Conform Teoremei numărului ciclomatic, graful H = T2 + f = (V, F2 ∪ {f }) obt, inut din arborele
part, ial T2 prin adăugarea muchiei f cont, ine un ciclu elementar unic C s, i f ∈ E(C). Arborele T1 nu
TEMA 5. ARBORI PART, IALI DE COST MINIM 68

cont, ine cicluri, deci există o muchie f ′ = [x′ , y ′] ∈ E(C) astfel ı̂ncât f ′ 6∈ F1 . Cum f ∈ F1 rezultă că
f ′ 6= f , deci f ′ ∈ E(C) \ {f }. Cum E(C) \ {f } ⊆ F2 , deducem că f ′ ∈ F2 \ F1 , deci f ′ ∈ F1 ∆F2 .
Atunci, din alegerea muchiei f conform proprietăt, ii (5.1.1) s, i din ipoteza că muchiile grafului G au
costurile diferite, avem
c(f ) < c(f ′ ).
Fie
T = (T2 + f ) − f ′
graful part, ial al lui G obt, inut din T2 prin adăugarea muchiei f s, i eliminarea muchiei f ′ , adică
T = (V, F ), unde F = (F2 ∪ {f }) \ {f ′ }.
Evident, T este conex (ı̂ntre nodurile x′ s, i y ′ există lant, ul obt, inut din ciclul C prin eliminarea
muchiei f ′ ) s, i are n − 1 muchii (deoarece T2 are n − 1 muchii). Conform Teoremei de caracterizare
a arborilor rezultă că T este un arbore part, ial al grafului G.
Deoarece c(f ) < c(f ′ ) obt, inem

c(T ) = c(T2 ) + c(f ) − c(f ′ ) < c(T2 ),

ceea ce contrazice faptul că arborele part, ial T2 are costul minim.
Observat, ia 5.1.3. Reciproca propozit, iei anterioare nu este adevărată. De exemplu, graful ponderat
din Figura 5.1.6 are un unic arbore part, ial de cost minim, reprezentat ı̂n Figura 5.1.7, des, i nu are
costurile muchiilor diferite (c([1, 2]) = c([2, 3]) = c([2, 5]) s, i c([1, 4]) = c([3, 6])).

20 20 20 20
1 2 3 1 2 3

10 20 10 10 20 10

4 5 6 4 5 6
30 40

Figura 5.1.6: Figura 5.1.7:

5.2 Algoritmii lui Kruskal s, i Prim


Algoritmul 5.2.1 (Kruskal). Fie (G, c) un graf ponderat conex cu G = (V, E), V = {v1 , . . . , vn }.
Algoritmul are n − 1 pas, i.

• La pasul i, i = 1, n − 1, dintre muchiile neselectate la pas, ii anteriori se selectează o muchie


ei ∈ E de cost minim cu proprietatea că nu formează cicluri cu muchiile {e1 , . . . , ei−1 } selectate
la pas, ii anteriori.

Algoritmul 5.2.2 (Prim). Fie (G, c) un graf ponderat conex cu G = (V, E), V = {v1 , . . . , vn }.
Algoritmul are n pas, i.

• La pasul 0 se selectează un nod arbitrar x0 ∈ V .


TEMA 5. ARBORI PART, IALI DE COST MINIM 69

• La pasul i, i = 1, n − 1, se selectează o muchie ei = [xj , xi ] ∈ E de cost minim cu proprietatea


că are ca extremităt, i un nod xj ∈ V selectat la un pas anterior s, i celălalt nod xi ∈ V neselectat
la pas, ii anteriori; se selectează s, i nodul xi .

Teorema 5.2.1 (de corectitudine a algoritmilor Kruskal s, i Prim). În contextul Algoritmilor
Kruskal sau Prim, fie F = {e1 , . . . , en−1 } mult, imea muchiilor selectate. Atunci T = (V, F ) este un
arbore part, ial de cost minim al grafului ponderat (G, c).
Demonstrat, ie. Vom prezenta o demonstrat, ie comună a corectitudinii celor doi algoritmi. Fie T0 =
(V, ∅) s, i Ti = (V, {e1 , . . . , ei }), ∀ i ∈ {1, 2, . . . , n − 1}, unde e1 , e2 , . . . , en−1 sunt muchiile selectate, ı̂n
această ordine, de Algoritmul Kruskal sau de Algoritmul Prim.
Graful G fiind conex, selectarea muchiei ei este posibilă la fiecare pas i, iar Ti este o pădure
part, ială a lui G (afirmat, ie evidentă pentru Algoritmul Kruskal, iar pentru Algoritmul Prim este o
consecint, ă a faptului că nodurile neselectate la pasul i sunt izolate ı̂n Ti ).
Demonstrăm prin induct, ie după i ∈ {0, 1, . . . , n − 1} că există un APM T ⋆ = (V, F ⋆ ) astfel ı̂ncât

Ti ⊆ T ⋆ (adică {e1 , . . . , ei } ⊆ F ⋆ ). (5.2.1)

Pentru i = 0 afirmat, ia este evidentă, luând T ⋆ orice APM (există, deoarece G este conex).
Presupunem (5.2.1) adevărată pentru i − 1, adică există T ⋆ = (V, F ⋆ ) APM cu Ti−1 ⊆ T ⋆ s, i o
demonstrăm pentru i (i ∈ {1, 2, . . . , n − 1}).
Fie ei = [xj , xi ] muchia selectată de Algoritmul Kruskal sau de Algoritmul Prim la pasul i. În
cazul Algoritmului Prim, xj este nodul selectat la un pas anterior (j ≤ i − 1). Avem două cazuri.
Cazul 1) ei ∈ F ⋆ . Atunci {e1 , . . . , ei } ⊆ F ⋆ , deci Ti ⊆ T ⋆ .
Cazul 2) ei 6∈ F ⋆ . Conform Teoremei numărului ciclomatic, graful H = T ⋆ + ei = (V, F ⋆ ∪ {ei })
obt, inut din T ⋆ prin adăugarea muchiei ei cont, ine un ciclu elementar unic

Ci = [xj , w0 , . . . , wk , xi , xj ]

având ultima muchie chiar muchia ei . Cum Ti = Ti−1 +ei este o pădure, rezultă că xj s, i xi sunt ı̂n com-
ponente conexe diferite ale lui Ti−1 (ı̂n caz contrar Ti ar cont, ine un ciclu de forma [xj , y0 , . . . , yr , xi , xj ]
având ultima muchie ei ). Rezultă că lant, ul elementar

µi = [xj , w0 , . . . , wk , xi ]

(obt, inut din ciclul Ci prin eliminarea muchiei ei ) cont, ine o muchie e′i = [x′ , y ′] astfel ı̂ncât x′ este
ı̂n aceeas, i componentă conexă cu xj ı̂n pădurea Ti−1 , iar y ′ nu este ı̂n această componentă conexă.
Evident, rezultă că e′i nu este muchie a lui Ti−1 , adică e′i 6∈ {e1 , . . . , ei−1 }, iar graful Ti′ = Ti−1 + e′i
nu cont, ine cicluri. De asemenea, e′i 6= ei , deci e′i ∈ F ∗ .
Pe de o parte, din descrierea Algoritmului Kruskal deducem că

c(ei ) ≤ c(e′i )

(deoarece muchia e′i nu formează cicluri cu {e1 , . . . , ei−1 }, deci ei fiind muchia selectată la pasul i
verifică această inegalitate).
Pe de altă parte, din descrierea Algoritmului Prim deducem că la pasul i nodul x′ era deja selectat
la un pas anterior (fiind ı̂n aceeas, i componentă conexă cu xj ı̂n Ti−1 ), iar nodul y ′ nu era selectat la
un pas anterior (nefiind ı̂n acea componentă conexă), deci din nou avem

c(ei ) ≤ c(e′i )
TEMA 5. ARBORI PART, IALI DE COST MINIM 70

(ei fiind muchia selectată la pasul i verifică această inegalitate).


Continuăm demonstrat, ia comună pentru cei doi algoritmi. Fie

T ⋆⋆ = (T ⋆ + ei ) − e′i

graful part, ial al lui G obt, inut din T ⋆ prin adăugarea muchiei ei s, i eliminarea muchiei e′i , adică
T ⋆⋆ = (V, F ⋆⋆ ), unde F ⋆⋆ = F ⋆ ∪ {ei } \ {e′i }.
Evident, T ⋆⋆ este conex (T ⋆ este conex iar ı̂ntre nodurile x′ s, i y ′ după eliminarea muchiei e′i
rămâne lant, ul obt, inut din ciclul Ci prin eliminarea acestei muchii) s, i are n − 1 muchii (deoarece
T ⋆ are n − 1 muchii). Conform Teoremei de caracterizare a arborilor rezultă că T ⋆⋆ este un arbore
part, ial al grafului G.
Deoarece c(ei ) ≤ c(e′i ) obt, inem

c(T ⋆⋆ ) ≤ c(T ⋆ )

s, i cum T ⋆ este un APM rezultă că s, i T ⋆⋆ este un APM (s, i, ı̂n plus, c(T ⋆⋆ ) = c(T ⋆ )). Cum Ti ⊆ T ⋆⋆ ,
demonstrat, ia prin induct, ie a relat, iei (5.2.1) este completă.
Luând i = n−1 ı̂n această relat, ie obt, inem că T ⊆ T ⋆ , unde T = Tn−1 = (V, F ), F = {e1 , . . . , en−1 }
(mult, imea muchiilor selectate de algoritm) iar T ⋆ este un APM. Dar T s, i T ⋆ au fiecare câte n − 1
muchii, deci T = T ⋆ s, i astfel T este un APM al grafului dat.
Exemplul 5.2.1. Fie graful ponderat (G, c) reprezentat ı̂n Figura 5.2.1, unde costul fiecărei muchii
este scris lângă segmentul corespunzător acesteia.

30 50 100
1 2 3 4
20
90
70 60 6
110 70 120
0
15

5 80
40
10
7 8 9 10
100 30 130

Figura 5.2.1:

Aplicarea Algoritmului Kruskal este evident, iată ı̂n următorul tabel:


Pas Muchia selectată Costul ei
1 [5, 8] 10
2 [3, 6] 20
3 [1, 2] 30
4 [8, 9] 30
5 [2, 3] 50
6 [2, 5] 60
7 [4, 6] 90
8 [7, 8] 100
9 [4, 10] 120
TEMA 5. ARBORI PART, IALI DE COST MINIM 71

Arborele part, ial de cost minim obt, inut este reprezentat ı̂n Figura 5.2.2. Costul acestui APM este de
510.

30 50
1 2 3 4
20
90
60 6
120
5
10
7 8 9 10
100 30

Figura 5.2.2:

Aplicarea Algoritmului Prim pentru acelas, i graf este evident, iată ı̂n următorul tabel:
Pas Muchia selectată Costul ei Nodul selectat
0 - - 1
1 [1, 2] 30 2
2 [2, 3] 50 3
3 [3, 6] 20 6
4 [2, 5] 60 5
5 [5, 8] 10 8
6 [8, 9] 30 9
7 [6, 4] 90 4
8 [8, 7] 100 7
9 [4, 10] 120 10
Arborele part, ial de cost minim obt, inut este deci acelas, i cu cel obt, inut prin aplicarea Algoritmului
Kruskal.
Observat, ia 5.2.1. Algoritmii Kruskal s, i Prim sunt specifici metodei de programare Greedy.
Algoritmul Kruskal selectează muchii, ı̂n ordinea crescătoare a costurilor, subgrafurile induse pe
parcurs de acestea nefiind neapărat conexe. Algoritmul Prim selectează muchii s, i noduri, nu neapărat
ı̂n ordinea crescătoare a costurilor muchiilor, iar subgrafurile induse pe parcurs de muchiile selectate
sunt conexe.
În implementări optime, se poate arăta că Algoritmul Kruskal are complexitatea O (m ln n) (fi-
ind necesară sortarea muchiilor după cost), iar Algoritmul Prim are complexitatea O (n2 ) ı̂n cazul
memorării grafului prin matricea de adiacent, ă (o astfel de implementare va fi prezentată ı̂n contin-
uare), unde n s, i m reprezintă numerele de noduri, respectiv de muchii ale grafului dat. Graful fiind
conex, m ≥ n − 1.
Pentru grafuri simple, m ≤ n(n−1)2
. Folosind s, i inegalitatea ln n ≤ n − 1, obt, inem că Algoritmul
Kruskal este mai eficient pentru grafuri ”sărace” ı̂n muchii, iar Algoritmul Prim este mai eficient
pentru grafuri ”bogate” ı̂n muchii.
Observat, ia 5.2.2. Pentru implementarea Algoritmului Kruskal, memorăm graful ponderat conex
(G, c), unde G = (V, E), V = {1, . . . , n}, E = {e1 , . . . , em }, ı̂ntr-o matrice cu 3 linii s, i m coloane
TEMA 5. ARBORI PART, IALI DE COST MINIM 72

P = (pik ) i = 1, 3 având semnificat, ia:


k = 1, m

dacă ek = [xk , yk ] ∈ E, atunci p1k = xk , p2k = yk s, i p3k = c(ek ).

Utilizăm un vector S cu semnificat, ia



1, dacă ek a fost selectată,
S[k] =
0, ı̂n caz contrar,

∀ k ∈ {1, . . . , m} s, i un vector CC cu semnificat, ia


CC[i] = numărul componentei conexe ı̂n care se află nodul i ı̂n graful indus de muchiile selectate,
∀ i ∈ {1, . . . , n}.
Astfel o muchie [x, y] nu formează cicluri cu muchiile selectate dacă s, i numai dacă

CC[x] 6= CC[y].

Descrierea ı̂n pseudocod a algoritmului are următoarea formă.


KRUSKAL :
SORTARE(P ); // se sortează coloanele matricei P
// crescător după 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ăutarea următoarei muchii ek ce va fi
ıncepe de pe pozit, ia poz + 1
// selectată ^
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ăm ek = [x, y]
cost ← cost + c; poz ← k;
aux ← CC[y]; // actualizăm 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];

Observat, ia 5.2.3. Pentru implementarea Algoritmului Prim, memorăm graful ponderat conex s, i
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) având semnificat, ia

 c([i, j]), dacă [i, j] ∈ E,
cij = 0, dacă i = j, (5.2.2)

∞, ı̂n rest,

∀i, j ∈ {1, . . . , n}. Pentru grafuri neorientate, matricea C este simetrică. În cazul grafurilor nesimple
putem lua
cij = min{c(e)|e = [i, j] ∈ E}.
TEMA 5. ARBORI PART, IALI DE COST MINIM 73

Utilizăm un vector S cu semnificat, ia



1, dacă nodul i a fost selectat,
S[i] =
0, ı̂n caz contrar

s, i doi vectori t s, i T AT A având semnificat, ia

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 următoarea formă.


PRIM :
S[1] ← 1; // selectăm nodul 1
cost ← 0; // costul APM
for i = 2, n do // init, ializări
S[i] ← 0; t[i] ← ci1 ; T AT A[i] ← 1;
for l = 1, n − 1 do // căutăm nodul y s, i 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ăm nodul y
x ← T AT A[y]; // s, i muchia [x, y]
cost ← cost + cxy ;
for i = 2, n do // actualizăm vectorii t s, i T AT A
if (S[i] = 0) and (t[i] > ciy ) then
t[i] ← ciy ; T AT A[i] ← y;
Tema 6

Grafuri euleriene

74
Tema 7

Grafuri hamiltoniene

75
Tema 8

Grafuri turneu

76
Tema 9

Colorări ı̂n grafuri

77
Tema 10

Grafuri bipartite

78
Tema 11

Grafuri planare

79
Tema 12

Distant, e s, i drumuri minime ı̂n grafuri


ponderate

80
Tema 13

Fluxuri ı̂n ret, ele de transport

81

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