Sunteți pe pagina 1din 265

Sorin N˘ad˘aban

ALGORITMICA

Andrea S¸andru

GRAFURILOR

- sinteze de curs ¸si aplicat¸ii -

Editura MIRTON Timi¸soara

2007

2

Prefat¸˘a

Grafurile au devenit ast˘azi foarte r˘aspˆandite datorit˘a ariei largi de aplica- bilitate a acestora, de la aplicat¸ii atˆat software cˆat ¸si hardware, la diverse aplicat¸ii ˆın modelarea sistemelor economice, ˆın ¸stiint¸ele inginere¸sti ¸si ˆın cele sociale. Aceast˘a carte constituie suportul pentru cursurile ¸si laboratoarele sust¸inu- te de c˘atre autori student¸ilor de la Facultatea de S¸tiint¸e Exacte din cadrul Universit˘at¸ii ”Aurel Vlaicu” Arad. Cartea prezint˘a, dup˘a o scurt˘a familiarizare cu limbajul utilizat, algoritmi esent¸iali pentru prelucrarea grafurilor. Sunt tratate subiecte precum: par- curgerea unui graf, matricea drumurilor, componente conexe ¸si tare conexe, drumuri de valoare optim˘a, arbore de acoperire minim, fluxuri maxime, pro- bleme de afectare ¸si ordonant¸are. Mult¸umim de pe acum tuturor celor care prin sugestii ¸si observat¸ii ne vor ajuta la ˆımbun˘at˘at¸irea unei eventuale reedit˘ari.

Arad, 23 noiembrie 2007

3

Autorii

Cuprins

Prefat¸˘a

3

1 Not¸iuni introductive

 

7

1.1 Reprezentarea grafurilor orientate

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

1.2 Grafuri neorientate

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

10

1.3 Operat¸ii cu grafuri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

11

1.4 Grafuri valorizate

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

1.5 Drumuri, circuite ¸si lant¸uri .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

16

1.6 Componente conexe ¸si tare conexe

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

1.7 Arbori

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

1.8 Grafuri bipartite

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

1.9 Ret¸ele de transport

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

24

1.9.1 Problema fluxului maxim

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

25

1.9.2 Probleme de transport

1.10 Exercit¸ii

.

.

.

.

.

.

.

.

.

.

2 Algoritmi pentru grafuri

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

27

1.9.3 Probleme de afectare

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

29

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

31

33

2.1 Matricea drumurilor

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

33

2.1.1 Algoritmul lui Roy-Warshall

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

33

2.1.2 Metoda compunerii booleene

 

.

.

.

.

.

.

.

.

.

.

.

35

2.1.3 Algoritmul lui Chen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

38

2.1.4 Algoritmul lui Kaufmann .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

40

2.2 Determinarea componentelor conexe .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

42

2.2.1 Algoritmul de scanare al grafului

.

.

.

.

.

.

.

.

.

.

.

.

42

2.2.2 Componente conexe

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

44

2.3 Determinarea componentelor tare conexe

.

.

.

.

.

.

.

.

.

.

.

.

44

2.3.1

Algoritmul Malgrange

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

44

4

CUPRINS

5

 

2.3.2 Algoritmul Chen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

47

2.3.3 Algoritmul Foulkes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

51

 

2.4

Determinarea circuitelor euleriene

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

53

 

2.4.1 Introducere

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

53

2.4.2 Algoritmul lui Euler

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

54

 

2.5

Drumuri ¸si circuite hamiltoniene .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

55

 

2.5.1 Algoritmul lui Kaufmann

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

55

2.5.2 Algoritmul lui Foulkes

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

56

2.5.3 Algoritmul lui Chen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

57

 

2.6

Drumuri de valoare optim˘a .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

59

 

2.6.1 Algoritmul lui Ford

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

59

2.6.2 Algoritmul Bellman-Kalaba

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

61

2.6.3 Algoritmul lui Dijkstra

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

62

2.6.4 Algoritmul Floyd-Warshall .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

65

 

2.7

Arbore de acoperire minim

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

67

 

2.7.1 Algoritmul lui Kruskal

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

68

2.7.2 Algoritmul lui Prim .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

70

 

2.8 Algoritmul Ford-Fulkerson

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

71

2.9 Probleme de afectare

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

73

 

2.9.1 Algoritmul lui Little

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

73

2.9.2 Algoritmul ungar

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

89

 

2.10 Probleme de ordonant¸are

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

92

 

2.10.1 Metoda potent¸ialelor

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

92

Diagrama Gantt .

2.10.2 .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

94

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

3

2.10.3 Algebr˘a de ordonant¸are .

.

2.11 Exercit¸ii

.

.

.

.

.

.

.

.

.

.

Aplicat¸ii

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

97

106

3.1 Reprezentarea grafurilor

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 106

3.2 Parcurgerea unui graf .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 120

 

3.2.1 Introducere

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 120

3.2.2 Parcurgerea ˆın l˘at¸ime

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 120

3.2.3 Parcurgerea ˆın adˆancime

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 122

3.2.4 Sortarea topologic˘a a unui graf

.

.

.

.

.

.

.

.

.

.

.

.

. 124

 

3.3 Operat¸ii cu grafuri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 136

3.4 Lant¸uri ¸si cicluri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 153

3.5 Arbori

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 162

3.6 Matricea drumurilor

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 168

6

CUPRINS

3.7 Componente conexe ¸si tare conexe

 

.

.

.

.

.

.

.

.

.

.

.

.

.

. 177

3.8 Determinarea circuitelor euleriene

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 194

3.9 Drumuri ¸si circuite hamiltoniene

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 199

3.10 Drumuri de valoare optim˘a

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 209

3.11 Arbore part¸ial de cost minim

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 220

3.12 Problema fluxului maxim

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 228

3.13 Probleme de afectare

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 233

3.14 Probleme de ordonant¸are .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 235

3.15 Aplicat¸ii propuse

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 242

A Limbajul C/C++

 

251

A.1

Vocabularul limbajului

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 251

A.2

Tipuri de date standard

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 252

A.3

A.4

. Declararea variabilelor

Constante

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 252

. 252

A.5

Expresii

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 253

A.6

Tablouri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 254

A.7

A.8

. Apelul ¸si prototipul funct¸iilor

Funct¸ii .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 254

. 255

A.9

Preprocesare. Includeri de fi¸siere.

 

Substituiri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 256

A.10 Structuri ¸si tipuri definite de utilizator

.

.

.

.

.

.

.

.

.

.

.

.

. 257

A.11 Citiri/scrieri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 257

A.12 Instruct¸iuni

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 258

A.13 Pointeri

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 260

A.14 Fi¸siere text

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 261

B Metoda BACKTRACKING

 

263

Bibliografie

265

Capitolul 1 Not¸iuni introductive

1.1 Reprezentarea grafurilor orientate

Definit¸ia 1.1.1 Se nume¸ste graf orientat perechea G = (X, U ) format˘a

dintr-o mult¸ime X = {x 1 , x 2 , ¸si o mult¸ime U = {u 1 , u 2 , numite arce.

, x n } ale c˘arei elemente se numesc vˆarfuri , u m } format˘a din perechi ordonate de vˆarfuri

Exemplul 1.1.2 Fie graful G = (X, U ) unde X

U = {(1, 2), (1, 4), (1, 5), (2, 4), (3, 1), (3, 2), (3, 5), (4, 4), (4, 5), (5, 3)}.

= {x 1 , x 2 , x 3 , x 4 , x 5 } ¸si

Observat¸ia 1.1.3 Remarc˘am c˘a s-a f˘acut convent¸ia ca arcul (x 3 , x 1 ) s˘a fie notat (3, 1) ¸s.a.m.d.

Observat¸ia 1.1.4 Un graf orientat (X, U ) poate fi privit ¸si ca ansamblul format dintr-o mult¸ime finit˘a X ¸si o relat¸ie binar˘a 1 U pe X .

Observat¸ia 1.1.5 Un graf orientat (X, U ) este de fapt ansamblul format dintr-o mult¸ime finit˘a X ¸si o aplicat¸ie multivoc˘a Γ : X X.

Pentru graful din exemplul 1.1.2 aplicat¸ia multivoc˘a Γ : X X este definit˘a prin:

Γ(x 1 ) = {x 2 , x 4 , x 5 } ,

Γ(x 2 ) = {x 4 } ,

Γ(x 3 ) = {x 1 , x 2 , x 5 } ,

Γ(x 4 ) = {x 4 , x 5 } ,

Γ(x 5 ) = {x 3 } .

1 o submult¸ime a produsului cartezian X × X.

7

8

CAPITOLUL 1.

NOT¸ IUNI INTRODUCTIVE

Observat¸ia 1.1.6 Un graf orientat admite o reprezentare sagital˘a, vˆarfurile fiind reprezentate prin cercuri, iar arcele prin s˘aget¸i.

reprezentate prin cercuri, iar arcele prin s˘aget¸i. Figura 1.1: Reprezentarea sagital˘a a grafului din exemplul

Figura 1.1: Reprezentarea sagital˘a a grafului din exemplul 1.1.2

Definit¸ia 1.1.7 Dac˘a consider˘am arcul u = (x i , x j ) atunci x i se nume¸ste extremitatea init¸ial˘a, iar x j se nume¸ste extremitatea final˘a a arcului u. Vˆarfurile x i ¸si x j se numesc adiacente. Un graf se nume¸ste complet dac˘a vˆarfurile sale sunt adiacente dou˘a cˆate dou˘a. Vˆarful x j se nume¸ste succesor al lui x i , iar vˆarful x i se nume¸ste predece- sor al lui x j . Pentru un vˆarf x X vom nota prin Γ (x) mult¸imea predecesorilor lui x, adic˘a Γ (x) = {y X : (y, x) U }. Vom nota prin Γ + (x) mult¸imea succesorilor lui x, adic˘a Γ + (x) = {y X : (x, y) U }. Num˘arul predecesorilor lui x se noteaz˘a d (x) ¸si se nume¸ste semigrad in- terior al lui x. Num˘arul succesorilor lui x se noteaz˘a d + (x) ¸si se nume¸ste semigrad exterior al lui x. Num˘arul d(x) := d (x) + d + (x) se nume¸ste gradul vˆarfului x. Un vˆarf de grad 0 se nume¸ste vˆarf izolat. Un arc de forma (x i , x i ), adic˘a de la un vˆarf la el ˆınsu¸si, se nume¸ste bucl˘a.

Observat¸ia 1.1.8 Pentru graful din exemplul 1.1.2 remarc˘am c˘a (x