Sunteți pe pagina 1din 132

Sergiu CORLAT

Andrei CORLAT

GRAFURI
Noiuni. Algoritmi. Implementri

Chiinu, 2012

Aprobat pentru editare de Senatul Universitii Academiei de tiine a Moldovei

Lucrarea este destinat studenilor facultilor de matematic i informatic a


instituiilor de nvmnt superior din republic, care studiaz cursul de teorie a
grafurilor. Este de asemenea util elevilor i profesorilor de informatic pentru
pregtirea ctre concursurile naionale i internaionale de programare.
Autori:
Sergiu Corlat, lector superior, UnAM
Andrei Corlat, dr. confereniar, UnAM
Recenzeni:
Sergiu Cataranciuc, dr. confereniar, USM
Andrei Braicov, dr. confereniar, UST

S. Corlat, A. Corlat, 2012

Cuprins

Introducere ............................................................................................................7
Capitolul 1. Noiuni generale.................................................................................9
1.1 Definiii ........................................................................................................9
1.2 Structuri de date pentru reprezentarea unui graf ....................................17
Exerciii: ...........................................................................................................20
Capitolul 2. Parcurgeri. Conexitate......................................................................21
2.1 Parcurgerea grafului ..................................................................................21
2.2 Grafuri tare conexe ...................................................................................25
Algoritmul Kosaraju .........................................................................................26
2.3 Baze n graf ................................................................................................28
Exerciii: ...........................................................................................................29
Capitolul 3. Mulimi independente i dominante ...............................................30
3.1 Mulimi independente ..............................................................................30
3.2 Generarea tuturor mulimilor maximal independente .............................31
3.3 Mulimi dominante....................................................................................36
Exerciii ............................................................................................................38
Capitolul 4. Colorri .............................................................................................39
4.1 Numrul cromatic ......................................................................................39
4.2. Algoritmul exact de colorare ....................................................................42
4.3. Algoritmi euristici de colorare ..................................................................43
Exerciii: ...........................................................................................................45

Capitolul 5. Drumuri minime n graf ....................................................................46


5.1 Distana minim ntre dou vrfuri. Algoritmul Dijkstra ...........................47
5.2 Distana minim ntre toate vrfurile. Algoritmul Floyd ...........................52
Exerciii ............................................................................................................54
Capitolul 6. Centre n graf....................................................................................55
6.1 Divizri .......................................................................................................55
6.2 Centrul i raza grafului ...............................................................................57
6.3 P-centre .....................................................................................................58
6.4 Centrul absolut ..........................................................................................60
6.5 Metoda Hakimi pentru determinarea centrului absolut ...........................62
Exerciii: ...........................................................................................................70
Capitolul 7. Mediane ...........................................................................................71
7.1 Mediane.....................................................................................................71
7.2. Mediana absolut .....................................................................................73
7.3 P-mediane .................................................................................................74
7.4 Algoritmi pentru determinarea p-medianei ..............................................75
Exerciii: ...........................................................................................................78
Capitolul 8. Arbori ...............................................................................................79
8.1 Arbori de acoperire ...................................................................................79
8.2 Arbori de acoperire de cost minim ............................................................83
Algoritmul Kruskal ...........................................................................................84
Algoritmul Prim ...............................................................................................85
Exerciii ............................................................................................................88

Capitolul 9. Cicluri................................................................................................89
9.1 Numrul ciclomatic i mulimea fundamental de cicluri .........................89
9.2 Tieturi ......................................................................................................91
9.3 Cicluri Euler ................................................................................................93
9.4 Algoritmul de construcie a ciclului eulerian .............................................95
Exerciii ......................................................................................................... 100
Capitolul 10. Cicluri hamiltoniene .................................................................... 101
10.1 Cicluri i lanuri hamiltoniene .............................................................. 101
10.2 Algoritmul pentru determinarea ciclurilor (lanurilor) hamiltoniene .. 103
10.3 Problema comisului voiajor .................................................................. 106
Exerciii ......................................................................................................... 109
Capitolul 11. Fluxuri n reea ............................................................................ 110
11.1 Preliminarii ........................................................................................... 110
11.2.Algoritm ................................................................................................ 111
11.3 Flux maxim cu surse i stocuri multiple ............................................... 118
11.4 Flux maxim pe grafuri bipartite ........................................................... 119
11.5 Flux maxim pe grafuri cu capaciti restricionate ale vrfurilor i
muchiilor....................................................................................................... 120
Exerciii ......................................................................................................... 122
Capitolul 12. Cuplaje......................................................................................... 123
12.1 Cuplaje .................................................................................................. 123
12.2 Graf asociat........................................................................................... 124
12.3 Funcia de generare a grafului asociat ................................................. 125
12.4 Generarea tuturor cuplajelor maxime ................................................. 126
Exerciii ......................................................................................................... 129
Bibliografie ....................................................................................................... 130

vbcb

Introducere
Aprute din necesitatea de a modela diverse situaii, relaii sau
fenomene n form grafic, grafurile i-au gsit o multitudine de
aplicaii n cele mai diverse sfere ale activitii umane: construcii i
sociologie, electrotehnic i politologie, chimie i geografie acest ir
poate fi continuat la nesfrit.
Teoria grafurilor a luat natere de la problema podurilor din
Konigsberg, cercetat de Euler i s-a dezvoltat ca un compartiment al
matematicii clasice pn la momentul apariiei sistemelor electronice de
calcul i a teoriei algoritmilor. n contextul rezolvrii problemelor de
calcul automat, grafurile s-au dovedit a fi un instrument universal i
extrem de flexibil, devenind un compartiment al matematicii aplicate.
O adevrat revoluie a cunoscut-o teoria grafurilor n anii 60
80 ai secolului trecut, cnd a fost stabilit posibilitatea de utilizare a lor
pentru rezolvarea problemelor de optimizare. Algoritmii pentru
determinarea drumului minim, punctelor mediane, centrelor, de
maximizare a fluxurilor, dar i multe altele au devenit componente
vitale ale cercetrilor operaionale i a metodelor de optimizare.
n aspect informatic grafurile apar i n calitate de structuri
eficiente de date, n special arborii, care permit realizarea optim a
algoritmilor de sortare i cutare.
Numrul de lucrri, care studiaz aspectele algoritmice ale
teoriei grafurilor este unul impuntor. Printre primele apariii se
numr Applied graph theory de Wai-Kai Chen; Graph Theory. An
Algorithmic approach de Nicos Christofides; urmate de Algorithmic
ghaph theory de Alan Gibbons, Algorithms in C de Thomas Sedgewick i
multe alte ediii. Totui, majoritatea ediiilor se axeaz doar pe
descrierea matematic a algoritmilor, fr a le suplini prin
implementri ntr-un limbaj de programare sau altul, or, tocmai
implementarea algoritmului este componenta de importan maxim
pentru programatorii practicieni.
n prezenta lucrare se ncearc abordarea vertical a
algoritmilor clasici ai teoriei grafurilor: de la noiuni teoretice, definiii
7|Page

i teoreme, ctre descrieri matematice a algoritmilor, urmate de


implementri integrale sau pariale (fr prezentarea subprogramelor
auxiliare) n limbajul de programare C, nsoite i de prezentarea i
analiza rezultatelor.
Un motiv al prezentrii pariale a implementrilor algoritmilor
este concepia de manual a lucrrii: restabilirea prilor lips a
programelor devine un exerciiu practic pentru toi cei care studiaz
cursul de Teorie a grafurilor n instituiile de nvmnt superior din
republic.
Ediia este destinat nu doar studenilor facultilor de profil,
dar i elevilor pasionai de informatic, precum i profesorilor, care au
n grija lor pregtirea de performan n domeniul Informaticii teoria
grafurilor este inclus n calitate de compartiment obligatoriu n
curriculumul internaional de performan pentru Computer Science.
Exerciiile, cu care finalizeaz fiecare capitol, pot fi folosite n calitate
de lucrri de laborator rezolvarea lor presupune prezena
cunotinelor teoretice dar i a competenelor practice de programare.
Venim i cu o recomandare pentru instrumentele informatice,
care pot fi utilizate pentru rezolvarea exerciiilor propuse la finele
fiecrui capitol: cele mai prietenoase medii de programare s-au
dovedit a fi compilatoarele Dev C++ i MinGW Developer Studio
ambele produse n distribuie liber.
Sperm c ediia va deveni nu doar un suport teoretic eficient,
dar i unul aplicativ pentru toi cei care studiaz elementele de
programare i cursurile de teorie a grafurilor.
n final inem s aducem sincere mulumiri academicianului
Petru Soltan, care cu ani n urm ne-a dus cursul de teorie a grafurilor
la catedra de Cibernetic Matematic a Universitii de Stat din
Moldova; colaboratorilor catedrelor de profil de la Universitatea de Stat
din Moldova, Universitatea de Stat Tiraspol i Universitatea Academiei
de tiine a Republicii Moldova, care au adus un aport considerabil la
redactarea i recenzarea ediiei.
30 noiembrie 2011
8|Page

Autorii

Capitolul 1. Noiuni generale


n acest capitol:

Grafuri. Vrfuri, muchii.


Grad al vrfului, vecini
Ci, cicluri
Subgrafuri
Grafuri orientate, planare, conexe
Metode de reprezentare a grafurilor: matricea de adiacen, matricea de
inciden, lista de muchii, lista de vecini

1.1 Definiii
Def. Graf neorientat (graf) o pereche arbitrar G (V , E ) E {u, v}: u, v V & u v

2
1

Def. Graf orientat (graf) o pereche arbitrar

G (V , E ) , n care E V V
Des 1.1. Graf neorientat

V
formeaz mulimea vrfurilor
grafului, E mulimea muchiilor. De obicei
vrfurile grafului sunt reprezentate n plan
prin puncte sau cercuri iar muchiile prin
segmente care unesc vrfurile.
Pentru
graful
din
desenul
1.1

2
1

Des 1.2 Graf orientat

V 1, 2,3, 4 , E {1, 2},{2,3},{3, 4},{1, 4},{2, 4}

9|Page

ntr-un graf orientat muchiile1 se reprezint prin sgei, care


indic direcia de deplasare pe muchie. Pentru graful orientat din
desenul 1.2 V 1, 2,3, 4 , E (1, 4),(2,1),(3, 2),(3, 4),(4, 2) .
Muchia (u, v) este incident vrfurilor

u, v ,

iar acestea sunt

adiacente muchiei.

Grade
Def.

Gradul vrfului

v, d (v) este numrul de muchii, incidente

acestuia2. Un vrf este izolat, dac gradul lui este 0.


Mulimea de vecini ai vrfului vi , (vi ) este format din
vrfurile adiacente la vi . ntr-un graf orientat mulimea vecinilor este

format din dou componente distincte: (vi ) (vi )

(vi ) .

(vi ) este format din vrfurile arcelor cu originea n vi . (vi )


este format din vrfurile-origine ale arcelor care se termin n

vi .

Pentru

vrful

din

graful

reprezentat

pe

desenul

1.2

(4) 2 , (4) 1,3 .


Ci i cicluri
Def.

Cale n graf este o consecutivitate de vrfuri v1 , v2 ,...vk astfel nct

i 1,..., k 1 vrfurile vi , vi 1 sunt adiacente3. Dac toate vrfurile


v1 , v2 ,...vk sunt distincte, calea se numete elementar. Dac
v1 vk atunci v1 , v2 ,...vk formeaz un ciclu n G . Ciclul este
elementar, dac v1 , v2 ,...vk 1 sunt distincte.
Muchia n graful orientat se numete i arc.
Pentru vrfurile din grafuri orientate se definesc semigrade de intrare (numrul de muchii,
care intr n vrf) i semigrade de ieire (numrul de muchii cu originea n vrful dat)
3
Exist muchia (vi , vi 1 )
1
2

10 | P a g e

Pe desenul 1.1 secvena de vrfuri 1,2,4 formeaz o cale;


secvena 1,2,4,1 un ciclu elementar.
n grafurile orientate noiunea de cale este substituit prin lan.
Def.

Lanul este o consecutivitate de muchii (arce) luate astfel, nct


vrful arcului (i) coincide cu originea arcului (i+1).

Pe desenul 1.2 secvena de arce (3,4)(4,2)(2,1) formeaz un lan;


secvena (1,4)(4,2)(2,1) un ciclu elementar.

Subgrafuri
Def. Subgraf al grafului G (V , E ) se numete orice graf G (V , E)
astfel nct V V , E E .
Subgrafurile se obin din graful iniial fie prin excluderea
muchiilor, fie prin excluderea muchiilor i vrfurilor din graful iniial.
n cazul cnd din graful iniial se exclude vrful vi , odat cu el se
exclud i toate muchiile incidente acestuia. Excluderea muchiei (u, v)
nu presupune i excluderea din graf a vrfurilor u, v.
Dac n subgraful G (V , E) are loc relaia V V , subgraful
este unul bazic (desenul 1.3 B). Subgraful

GS' (VS , ES ) n care

VS V , ES E

dac

se

vi VS , (vi ) (vi )

numete

subgraf

generat

pentru

orice

X S (desenul 1.3 C). Cu alte cuvinte, GS' este

format dintr-o submulime VS a vrfurilor din G mpreun cu muchiile,


care au ambele extremiti n VS .
2

2
1

2
1

Des 1.3 Graful iniial (A), subgraf bazic (B), subgraf generat (C).

11 | P a g e

Tipologia grafurilor
Def.

Graful G (V , E ) se numete complet dac ntre oricare pereche


de vrfuri vi , v j V exist cel puin o muchie, care le unete. Un
graf complet cu n vrfuri se noteaz K n . (desenul 1.4 A)

Def. Graful orientat G (V , E ) este simetric, dac pentru orice arc

v , v E
i

exist i arcul v j , vi E . Graful orientat G (V , E )

este antisimetric, dac pentru orice arc vi , v j E arcul v j , vi

nu exist.
Def.

Graful neorientat G (V , E ) este bipartit, dac mulimea V a


vrfurilor lui poate fi divizat n dou submulimi distincte V

i V , astfel nct orice muchie din E are nceputul n V , iar


B

sfritul n V . (desenul 1.4 B) Graful orientat G (V , E ) este


B

bipartit, dac mulimea V a vrfurilor lui poate fi divizat n


dou submulimi distincte V

i V , astfel nct orice arc din E


B

are originea n V , iar sfritul n V .


A

Des 1.4
Graf complet K5 (A),
graf bipartit (B).

Teorema 1. Pentru ca graful neorientat G (V , E ) s fie


bipartit, este necesar i suficient ca el s nu conin cicluri de lungime
impar.
12 | P a g e


Necesitate. V V A

V B , V A V B . Fie n G exist un ciclu de

lungime impar vi1 , vi2 ,...vik , vi1 i vi1 V A . Deoarece lungimea ciclului
este impar, numrul de vrfuri, care descriu ciclul este par. G este
bipartit, prin urmare, vrfurile cu indici pari din ciclul vi1 , vi2 ,...vik , vi1
aparin componentei V . Prin urmare i vi1 V B , ceea ce contrazice
B

presupunerea iniial.
Suficien. Fie c n G nu exist nici un ciclu de lungime impar. n
acest caz se va construi o divizare corect a V n dou submulimi
distincte V

i V , astfel nct orice arc din E va avea originea n V ,


B

iar sfritul n V .
B

Se alege un vrf arbitrar vi i se eticheteaz cu +. Toate


vrfurile din (vi ) se eticheteaz cu semnul opus celui atribuit vi .
Vrful vi se consider cercetat.
Se alege un vrf etichetat,
necercetat. Operaia de etichetare a
vecinilor se repet pn nu apare
una din urmtoarele situaii:
(a) Toate
vrfurile
sunt
etichetate,
i
etichetele
atribuite
lor
coreleaz
(oricare dou vrfuri unite
prin o muchie au semne
diferite)

Des. 1.5 Etichetarea nodurilor. Cazul (b)

(b) Exist cel puin un vrf vik


etichetat deja, care poate fi
etichetat repetat cu semnul
opus din partea altui vrf
(desenul 1.5)

Des. 1.6 Fragmentul v,..., vi al cii 1 are


k
lungime par. Fragmentul

v,..., vik al cii

2 , are lungime impar.


13 | P a g e

(c) Toate vrfurile etichetate sunt cercetate, dar exist vrfuri fr


etichete.
n cazul (a) toate vrfurile etichetate cu + se includ n V , iar
A

cele etichetate cu- n V . Deoarece toate muchiile conecteaz vrfuri


cu etichete diferite, graful este bipartit.
Cazul (b). Ar putea s apar doar dac exist o cale
B

1 vi , vi ,..., vi n care semnele alterneaz i o cale 2 v j , v j ,..., v j , vi


1

cu aceeai proprietate.
Fie v ultimul vrf comun al cilor 1 , 2 diferit de vik . Dac n

1 semnele v vi

coincid, n 2 ele vor fi opuse (i invers: dac coincid

n 2 sunt opuse n 1 ). De aici rezult c unul din fragmentele

v,..., vik al cii 1 i v,..., vik al cii 2 , are un numr par de muchii, iar
cellalt un numr impar (des. 1.6). Respectiv, ciclul determinat de
reuniunea acestor dou fragmente va avea o lungime impar, ceea ce
contrazice condiiile iniiale. n consecin, cazul (b) este unul imposibil
n grafurile bipartite.
Cazul (c) indic divizarea grafului n subgrafuri izolate, prin urmare
fiecare dintre acestea urmeaz s fie cercetat separat. Prin urmare
cazul se reduce la (a).

Def.

Graful bipartit este numit complet dac

v V A , v V B (v, v) E
Graful bipartit complet cu pri formate din n i m vrfuri se
noteaz K n ,m (desenul 1.7)
Def.

Graful G (V , E ) este conex, dac pentru orice dou vrfuri

vi , v j V n G exist cel puin o cale, care le unete (desenul 1.8


A). n cazul n care graful este format din cteva subgrafuri
conexe separate el este neconex (desenul 1.8 B ).
14 | P a g e

A
B
Des. 1.8 Graf conex (A), graf neconex (B)

Des. 1.7
Graful bipartit complet K3,3

Def.

Graful G (V , E ) este numit arbore, dac este conex i nu


conine cicluri.

Def. Graful G (V , E ) este numit graf planar, dac poate fi reprezentat


n plan fr intersecii ale muchiilor.
Def.

O fa a grafului este o regiune a planului, delimitat de


muchiile acestuia, care nu conine n interior muchii sau vrfuri
ale grafului.

Pentru un graf amplasat pe o suprafa exist relaie ntre


numrul de vrfuri, muchii i fee. Relaia se numete caracteristic
Euler a suprafeei.
Teorema 2. (formula Euler) ntr-un graf planar conex are loc
urmtoarea relaie:

nmr 2
unde: n numrul de vrfuri ale grafului, m numrul de muchii, r
numrul de fee.

Demonstraie. Prin inducie dup numrul de muchii m.

m 0. n 1& r 1. 1 0 1 2.
Fie teorema este adevrat pentru m k.
Se adaug nc o muchie
Dac

muchia

unete

n k r 2.

m k 1.
dou

vrfuri

existente,

atunci

r r 1.

n (k 1) (r 1) n k r 1 1 n k r 2.
15 | P a g e

Dac muchia unete un vrf existent cu unul nou, atunci n n 1.

(n 1) (k 1) r n k r 1 1 n k r 2.

Corolar. ntr-un graf planar (n > 3), conex, m 3n 6 .

Fiecare fa este delimitat de cel puin 3 muchii, iar fiecare muchie


delimiteaz cel mult dou fee. Prin urmare 3r 2m . nlocuind n
formula precedent, se obine:

2 nmr nm

2m
6 3n 3m 2m m 3n 6
3

Teorema 3. Un graf este planar atunci i numai atunci cnd nu conine


subgrafurile K 5 i K 3,3
(fr demonstraie)

Ponderi
n unele cazuri muchiile grafului posed caracteristici numerice
suplimentare, numite ponderi. Muchiei (arcului) (vi , v j ) i se pune n
coresponden valoarea ci , j - ponderea (costul, lungimea etc.). Graful,
muchiilor cruia -i sunt asociate ponderi se numete graf cu muchii
ponderate. Pentru rezolvarea unor probleme este necesar i aplicarea
ponderilor la vrfurile grafului. Vrfului vi i se pune n coresponden
caracteristica numeric ci - ponderea (costul). Graful, vrfurilor cruia
-i sunt asociate ponderi se numete graf cu vrfuri ponderate.
Dac graful G (V , E ) este unul ponderat, atunci pentru cile
din graf se introduce caracteristica numeric l - cost (lungime) egal cu
suma ponderilor muchiilor din care este format o cale C .

l (C )

( vi , v j )C

16 | P a g e

ci , j

1.2 Structuri de date pentru reprezentarea unui graf


Pentru rezolvarea problemelor pe grafuri cu ajutorul
calculatorului, reprezentarea lor natural n form de puncte (pentru
noduri) i linii care le unesc (muchii) nu este nc cea mai optim.
Selectarea i utilizarea corect a structurilor de date care modeleaz un
graf poate influena ordinul complexitii algoritmului, prin urmare i
eficiena lui.
Structurile de date, prezentate n paragraful dat sunt cel mai
des utilizate n rezolvarea problemelor standard pe grafuri. Ele pot fi
folosite att pentru grafurile neorientate, ct i pentru cele orientate.
Structura de date clasic pentru reprezentarea unui graf

G (V , E ) este considerat matricea de inciden. Este realizat prin


un tablou bidimensional cu N linii (N numrul de vrfuri n graf,

N V ) i M coloane (M numrul de muchii, M E ). Fiecare


muchie (u, v) este descris ntr-o coloan a tabloului. Elementele
coloanei sunt egale cu 1 pentru liniile care corespund vrfurilor u i v ,
0 pentru celelalte. n cazul grafului orientat vrful din care ncepe
arcul este marcat cu -1, vrful final cu +1.
Pentru grafurile din des. 1.1,1.2 matricele de inciden vor fi

0
0
1
1

1
3
4

(3,4)

0
1
0
1

(2,4)

(3,4)

0
1
1

(3,2)

(2,4)

1
0
0
1

(1,4)

( ,3)

1
1
0
0

(2,1)

(1,4)

1
2
3
4

Des. 1.2

(1,2)

Des.1.1

+1
-1
0
0

-1
0
0
+1

0
+1
-1
0

0
+1
0
-

0
0
-1
+1

Matricea de inciden pentru un graf cu N noduri va avea N linii,


numrul de coloane fiind proporional cu N2. Numrul total de elemente
n structura de date este proporional cu N3. Utilizarea memoriei este n
17 | P a g e

acest caz ineficient, deoarece doar cte dou elemente din fiecare linie
vor conine date real utilizabile.

G (V , E ) este

O alt reprezentare matriceal a grafului

matricea de adiacen. Matricea de adiacen este i ea realizat


prin un tablou bidimensional, cu N linii i N coloane, n care elementul
cu indicii (i, j ) este egal cu 1 dac exist muchia care unete vrful vi cu
vrful v j i 0 n caz contrar. Datele despre muchia (vi , v j ) se dubleaz
n elementele tabloului cu indicii (i, j ) i ( j , i ) n grafurile orientate,
pentru arcul (vi , v j ) primete valoarea 1 doar elementul

(i, j ) al

tabloului.
Pentru grafurile din des. 1.1,1.2 matricele de adiacen vor fi
Des. 1.1
1
1
2
1
0
3
1
4

2
1
0
1
1

3
0
1
0
1

4
1
1
1
0

Des. 1.2
1
0
1
1
2
0
3
0
4

2
0
0
1
0

3
0
0
0
0

4
1
1
1
0

Matricea de adiacen pentru un graf cu N vrfuri are N linii i


N coloane. Numrul total de elemente n structura de date este N2.
O alt categorie de reprezentri ale grafului o formeaz
reprezentrile prin liste. Cea mai simpl pentru implementare list este
lista de muchii. Lista de muchii conine M perechi de forma (vi , v j ) ,
fiecare pereche reprezentnd o muchie din graf, descris prin vrfurile
care o formeaz. ntr-un graf orientat perechea descrie un arc, nceputul
lui fiind determinat de primul indice din pereche.
Pentru grafurile din des. 1.1,1.2 listele de muchii vor fi
Des.1.1

Des. 1.2

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

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

18 | P a g e

Lista de muchii este format din M perechi de elemente. M


numrul de muchii. Cu toate c structura este mai compact dect
matricea de inciden sau matricea de adiacen, majoritatea
operaiilor standard pe graful reprezentat n acest mod necesit
parcurgerea ntregii liste, ceea ce scade din eficiena structurii. n
grafurile orientate, primul element al perechii care descrie arcul va fi
vrful surs, al doilea vrful destinaie. n cazul n care muchiile
(arcele) au ponderi asociate, fiecare muchie (arc) va fi descris de un
triplet: indicii vrfurilor care o formeaz i ponderea acesteia.
nc o structur eficient este lista de inciden. Pentru
fiecare nod v V ea va conine o list unidirecional alocat dinamic,
cu toate vrfurile u : (v, u) E . Indicatorii ctre nceputul fiecrei liste
pot fi pstrai ntr-un tablou unidimensional. Elementul cu indicele i
din tablou va conine indicatorul ctre lista de vrfuri incidente vrfului

vi din graf. Pentru grafurile neorientate descrierea fiecrei muchii se


dubleaz, iar operaiile de adugare (lichidare) a muchiilor presupun
prelucrarea a dou liste.
Pentru grafurile din des. 1.1,1.2 listele de vrfuri vor fi:
1

19 | P a g e

Exerciii:
1. Pentru grafurile din imagini construii:

a)
b)
c)
d)

Matricea de inciden
Matricea de adiacen
Lista de muchii
Lista de vecini

2. Elaborai un program pentru citirea dintr-un fiier text a


matricei de adiacen a grafului ( V 20 )

i afiarea ei pe

ecran. Prima linie a fiierului de intrare va conine un numr


ntreg n dimensiunea matricei. Urmtoarele n linii vor conine
cte n numere ntregi, separate prin spaiu elementele matricei
de adiacen a grafului.

20 | P a g e

Capitolul 2. Parcurgeri. Conexitate


n acest capitol:

Parcurgerea grafului n lime


Parcurgerea grafului n adncime
Grafuri tare conexe
Determinarea componentelor tare conexe
Baze n graf

2.1 Parcurgerea grafului


Cele mai multe din problemele formulate pe grafuri necesit o
cercetare a legturii ntre vrfurile acestora. Evident, un algoritm
eficient va accesa muchia (vrful) de o singur dat, sau de un numr
constant de ori. De aici rezult necesitatea unor metode eficiente pentru
parcurgerea vrfurilor unui graf.
n caz general problema parcurgerii se formuleaz n felul
urmtor: Fie dat graful G (V , E ) . Pentru un vrf dat v V s se
determine mulimea U V : u U exist cel puin o cale ntre v i

u.
Una dintre cele mai eficiente metode de parcurgere n graf este
parcurgerea n adncime4. La baza metodei st principiul de
selectare recursiv a vrfurilor i etichetare a lor. Iniial toate vrfurile
se consider neatinse. Fie v0 vrful de la care ncepe parcurgerea. v0 se
eticheteaz ca fiind atins. Se alege un vrf u , adiacent v0 i se repet
procesul, pornind de la u . n general, fie v vrful curent. Dac exist
un vrf u , nou (neatins), adiacent v ( (v, u) E ), atunci procesul se
repet pornind de la u. Dac pentru vrful curent v nu mai exist
vrfuri vecine neatinse, el se eticheteaz ca fiind cercetat, iar procesul
de parcurgere revine n vrful precedent (din care s-a ajuns n v ). Dac
4

Depth first search (eng.)


21 | P a g e

v v0 parcurgerea a luat sfrit. Pentru realizarea algoritmului se vor


folosi marcaje aplicate vrfurilor grafului (0 nod nou, 1 atins, 2
cercetat).
Exemplu:
pentru
graful
din
imaginea
alturat
se
va
simula
parcurgerea n adncime din vrful 1, n
conformitate cu algoritmul descris anterior:
Pas 1
Pas 2
Pas 3
Pas 4
Pas 5
Pas 6

vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare

1
1
1
1
1
1
1
1
1
1
1
1

2
0
2
0
2
0
2
0
2
0
2
0

3
0
3
0
3
1
3
1
3
1
3
1

4
0
4
0
4
0
4
1
4
2
4
2

5
0
5
0
5
0
5
0
5
0
5
1

6
0
6
1
6
1
6
1
6
1
6
1

Pas 7
Pas 8
Pas 9
Pas 10
Pas 11
Pas 12

vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare

1
1
1
1
1
1
1
1
1
1
1
2

2
1
2
2
2
2
2
2
2
2
2
2

3
1
3
1
3
1
3
2
3
2
3
2

4
2
4
2
4
2
4
2
4
2
4
2

5
1
5
1
5
2
5
2
5
2
5
2

6
1
6
1
6
1
6
1
6
2
6
2

Un exemplu simplu de realizare a procedurii de parcurgere


n adncime pentru un graf cu N vrfuri, descris prin matricea de
adiacen, este prezentat n funcia DFS. Matricea de adiacen a
grafului este stocat n tabloul A. Marcajele vrfurilor se
pstreaz n tabloul liniar B (B[i] starea vrfului i) Iniial
toate marcajele vrfurilor sunt nule. Vrful din care este lansat
parcurgerea s.
int DFS (int s)
{
int i;
b[s]=1;
for(i=1;i<=n;i++)
if(a[s][i] !=0 && b[i]==0) DFS(i);
printf("%d ", s);
22 | P a g e

return 0;
}

Complexitatea funciei DFS n acest caz este

O( N 2 ) . Odat

marcat, nodul v nu mai permite relansarea parcurgerii DFS(v), iar


numrul maxim de apeluri ale funciei este N. Numrul de operaii n
corpul funciei este de asemenea proporional cu N.
Funcia propus lucreaz corect att pe grafuri neorientate, ct
i pe grafuri orientate.
n procesul de parcurgere, cu ct mai trziu este atins un vrf, cu
att mai repede el va fi cercetat (modelarea prin structuri tip LIFO).
Exist probleme n care este important ca vrfurile s fie cercetate n
ordinea atingerii (modelarea procesului prin structuri de date FIFO).
Pentru rezolvarea lor se poate utiliza o alt metod de cercetare a
grafului parcurgerea n lime5.
La fel ca metoda precedent, parcurgerea n lime ncepe de la
un nod dat v0 , plasat n ntr-o structur tip coada (iniial vid). Se
folosete un principiu de etichetare a vrfurilor identic celui folosit n
parcurgerea n adncime. n caz general, se extrage din coad nodul v
(la prima iteraie v v0 ), se determin toate vrfurile u noi (care nc
nu au fost plasate n coad, neatinse), adiacente v ( (v, u) E ), i se
adaug consecutiv n coad. La adugarea n coad vrfurile se
eticheteaz ca fiind atinse. Dup adugarea vrfurilor adiacente n
coad, nodul v este marcat cercetat. Dac coada devine vid parcurgerea a luat sfrit. Pentru realizarea algoritmului se vor folosi
aceleai marcaje aplicate vrfurilor ca i n cazul parcurgerii n
adncime.
Exemplu:
pentru
graful
din
imaginea
alturat
se
va
simula
parcurgerea n lime din vrful 1, n
conformitate cu algoritmul descris anterior:

Breadth first search (eng.)


23 | P a g e

Pas 1

atins
cercetat
atins
cercetat
atins
cercetat
atins
cercetat

Pas 2
Pas 3
Pas 4

Pas 5

6
1
2
1
3
1

Pas 6
3
6
5
6 2

Pas 7

atins
cercetat
atins
cercetat
atins
cercetat

5 4
1 6 2 3
4
1 6 2 3 5
1 6 2 3 5 4

n urmtorul exemplu coada este implementat prin un tablou


unidimensional B, nceputul ei fiind elementul cu indicele st, iar
sfritul elementul cu indicele dr. Elementele cu indicii 1,...,st-1
formeaz mulimea nodurilor cercetate la moment. Structurile de date
A, B, n au aceleai semnificaie ca i n funcia DFS. Tabloul C
modeleaz strile curente ale vrfurilor. Funcia BFS realizeaz
parcurgerea n lime, ncepnd de la vrful cu indicele s.
int BFS (int s)
{
int i, st, dr;
c[s]=1; b[1]=s; st=1;dr=1;
while (st<=dr)
{ for(i=1;i<=n;i++)
if(a[b[st]][i] !=0 && c[i]==0)
{ dr++; b[dr]=i; c[i]=1; }
printf("%d ", b[st]);
st++;
}
return 0;
}

Funcia BFS este implementat nerecursiv cu o complexitate

O( N ) . Numrul de operaii n corpul funciei este determinat de dou


2

instruciuni ciclice incluse, ambele avnd maxim N repetri.

24 | P a g e

2.2 Grafuri tare conexe


Def. Un graf orientat G (V , E ) se numete tare conex dac pentru
orice dou vrfuri vi , v j V exist cel puin cte un lan care
unete vi cu v j ( vi

v j ) i v j cu vi ( v j

vi ). ntr-un graf tare

conex orice dou vrfuri sunt reciproc accesibile.


Def. Graful G (V , E ) se numete unidirecional conex dac pentru
orice dou vrfuri vi , v j V exist cel puin unul din lanurile

vi

v j sau v j

vi . ntr-un graf unidirecional conex orice dou

vrfuri sunt conectate prin cel puin o cale.


Def. Component tare conex a unui graf orientat G (V , E ) se
numete mulimea maximal de vrfuri V V : vi , v j V
exist cel puin cte un lan vi

v j i v j

vi .

Determinarea componentelor tare conexe


Pentru determinarea componentelor tare conexe va fi folosit
graful transpus lui G. Pentru un graf orientat G (V , E ) , graful
transpus

este

GT (V , ET ) unde

ET (vi , v j ) : (v j , vi ) E . Graful

transpus are aceleai componente tare conexe ca i graful iniial.


Obinerea grafului transpus GT (V , E T ) cere un timp liniar
dup numrul de arce n graf (sau ptratic fa de numrul de vrfuri).
Procesul se realizeaz n mod diferit n dependen de modul de
reprezentare a grafului.
Fie graful G (V , E ) reprezentat prin
matricea de adiacen A(n n) . Matricea de adiacen a grafului

GT (V , ET ) se obine conform urmtoarei formule:

1 dac Aj ,i 1
AiT, j
i, j 1,..., n
0 n caz contrar
25 | P a g e

Exemplu: desenul 2.1: Graful iniial

G (V , E ) i graful transpus

GT (V , ET ) , reprezentate grafic.

Des. 2.1 Graful iniial (A) i graful transpus (B).

Algoritmul pentru determinarea componentelor tare conexe are


la baz observaia, c componentele tare conexe rmn aceleai att n
graful iniial ct i n cel transpus. Se vor folosi va folosi dou
parcurgeri n adncime pe grafurile GT i G .

Algoritmul Kosaraju
Pseudocod
Pas 1. Se construiete graful GT (V , E T )
Pas 2. Se lanseaz cutarea n adncime pornind de la fiecare vrf
necercetat din GT . Pentru fiecare parcurgere se memoreaz
cumulativ ordinea de cercetare a vrfurilor n vectorul f .
Pas 3. Se lanseaz cutarea n adncime pe graful iniial

G,

consecutiv, pornind de la ultimul vrf inclus n f ctre primul,


dup vrfurile necercetate.
Pas 4. La fiecare cutare n adncime realizat n pasul 3, se afieaz
vrfurile cercetate acestea formeaz o component tare
conex.

26 | P a g e

Exemplu implementare:
Se folosete matricea de adiacen a pentru reprezentarea
grafului iniial, at pentru reprezentarea grafului transpus, vectorul b
pentru descrierea strii vrfurilor, vectorul black pentru ordinea de
cercetare.
Input: Graful G (V , E )
Output: componentele tare conexe ale grafului, separate pe linii.
int DFS_DIR (int s) { // . . . descrisa anterior - DFS }
int DFS_TRANS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if( at[s][i] !=0 && b[i]==0) DFS_TRANS(i);
//amplasarea in stiva ordinii de cercetare
k++; black[k]=s;
return 0;
}
int main()
{ // . . .citirea datelor initiale
// transpunerea grafului
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==1) at[j][i]=1;
// Cautarea in adancime pe graful transpus
for(i=1;i<=n; i++) if (b[i]==0) DFS_TRANS(i);
// resetarea starii varfurilor
for(i=1;i<=n;i++) b[i]=0; printf("\n");
// parcurgerea in adancime pe graful initial
for(i=n;i>=1;i--) //Afisarea componentelor tare conexe
if (b[i]==0) {DFS_DIR(black[i]); printf("\n");}
return 0;
}

Reprezentarea grafic a rezultatelor:

Des. 2.2. Graful iniial (A),


Componentele tare conexe ale
grafului (fiecare component e
colorat aparte) (B)

27 | P a g e

Algoritmul are o complexitate ptratic fa de numrul de


vrfuri n graf. Pasul 1 al algoritmului necesit un numr de operaii
proporional cu n n . Paii 2 i 3 repet cutri n adncime, fiecare cu
o

complexitate

O( N 2 ) .

Prin

urmare,

complexitatea

total

algoritmului este O( N 2 ) . Demonstraia corectitudinii algoritmului


poate fi gsit n [7, p.420]

2.3 Baze n graf


O baz B a grafului G (V , E ) este format din o mulime de vrfuri
ale grafului, care posed urmtoarele dou proprieti:
(i)
Din B poate fi accesat orice vrf al grafului
(ii)
Nu exist nici o submulime B B care s pstreze
proprietatea (i)
O baz este determinat elementar n situaia n care au fost
identificate componentele tare conexe ale grafului. Deoarece n
interiorul componentei tare conexe toate vrfurile sunt reciproc
accesibile, rezult:
(a) n baz se include exact cte un vrf din fiecare component
tare conex
(b) Pentru construcia bazei vor fi folosite toate componentele tare
conexe.
Utilizarea bazelor permite reducerea dimensiunii problemelor pe
grafuri, n special n cazurile de cercetare a legturilor structurale n
organizaii.
Exemplu: pentru graful din desenul 2.1, n calitate de baze pot servi
mulimile {1,5,8}, {3,6,9}, {2,5,8},

28 | P a g e

Exerciii:
1. Simulai, pe pai, pentru graful
din imagine, parcurgerea n lime,
de la vrful 1
2. Simulai, pe pai, pentru graful din
imagine, parcurgerea n adncime,
de la vrful 1

3. Elaborai un program pentru parcurgerea n adncime a grafului


( V 20 ) (abordare recursiv)
4. Elaborai un program pentru parcurgerea n adncime a grafului
( V 20 ) (abordare iterativ)
5. Elaborai un program pentru parcurgerea n lime a grafului (

V 20 )
6. Elaborai un program pentru determinarea componentelor tare
conexe ale grafului ( V 20 )
7. Elaborai un program pentru generarea tuturor bazelor unui
graf cu cel mult 20 de vrfuri.

29 | P a g e

Capitolul 3. Mulimi independente i dominante


n acest capitol

Noiunea de mulime independent


Mulimi maximal independente.
Generarea mulimilor maximal independente
Mulimi dominante

3.1 Mulimi independente


Fie dat un graf neorientat G (V , E ) .
Def.

Mulime independent sau mulime interior stabil se numete o


mulime de vrfuri ale grafului, astfel nct oricare dou vrfuri
din ea nu sunt unite direct prin muchie.
Formulat matematic, mulimea independent

mulime, care satisface relaia: S V : S


Def.

este o

(S ) .

Mulimea S se numete maximal independent, dac nu exist o


alt mulime independent S , pentru care se ndeplinete
condiia: S S .

Des. 3.1. {1, 3,7} {2,8,7,4} {4,6}


mulimi independente.
Mulimile {2,8,7,4} , {2, 4, 6} sunt
maximal independente, iar {1,3},
{2,4} nu.

30 | P a g e

Nu toate mulimile maximal independente au acelai numr de


vrfuri. Prin urmare modul de selecie a celei mai bune mulimi
maximal independente va depinde de condiiile iniiale ale problemei
concrete.
Def.

Fie Q mulimea tuturor mulimilor independente a grafului

G (V , E ) . Numrul G max Q
SQ

se va numi numr de

independen a grafului G , iar mulimea S * , pentru care el se


obine mulime maxim independent.
Exemplu: pentru graful din desenul 3.1 setul de mulimi maximale
independente este {1, 3, 7}, {1, 6}, {1, 7, 8}, {2, 4, 6}, {2, 4, 7, 8}, {3, 4, 7},
{3, 5}, {5, 6}. Cea mai mare putere a mulimilor este 4, deci [G] = 4.
Mulimea maxim independent este {2, 4, 7, 8}

3.2 Generarea tuturor mulimilor maximal independente


Fie G (V , E ) . Prin graf complementar se nelege graful

G (V , E ) unde E {(u, v) : u, v V ; (u, v) E}


Problema mulimilor maximal independente se reduce direct la
problema generrii subgrafurilor complete, rezolvat pe graful
complementar G (V , E ) . Aceasta din urm este o problem de
complexitate exponenial. De aici rezult i complexitatea
exponenial a algoritmului pentru determinarea tuturor mulimilor
maximal independente. Tehnica general a abordrii este tehnica
relurii, care poate fi parial optimizat prin ordonarea vrfurilor dup
micorarea puterii acestora. Algoritmul de parcurgere sistematic a
fost propus de Bron i Carbosh. El evit generarea repetat a
mulimilor, crend noi mulimi prin mbuntirea celor existente.

31 | P a g e

Motivarea algoritmului
Algoritmul se bazeaz pe arborele de cutare. Prin urmare, este
eficient realizarea lui recursiv.
n general la pasul k mulimea independent S k se extinde prin
adugarea unui vrf nou, pentru a obine mulimea Sk 1 la pasul k 1 .
Procesul se repet att timp, ct este posibil. La momentul, n care nu
mai putem aduga vrfuri avem obinut o mulime maximal
independent.
Fie Qk va fi la pasul k - mulimea maximal de vrfuri, pentru
care (Sk )

Qk . Prin adugarea unui vrf din Qk n S k se obine

Sk 1 . Qk e format n general din 2 componente: Qk a vrfurilor deja

folosite n procesul de cutare pentru extinderea S k i Qk a vrfurilor

care nc nu s-au folosit n cutare. Pentru adugarea n S k se vor folosi

doar vrfurile din Qk . Astfel, procedura de adugare a vrfului nou e

urmtoarea:
a) selectarea unui nod xik Qk
b) construirea mulimii Sk 1 Sk
c) formarea

Qk1 Qk ( xik )

(*)

x
ik

Qk1 Qk ( xik ) ( xik )

Pasul de ntoarcere presupune lichidarea vrfului xik din Sk 1

pentru revenirea la mulimea S k cu deplasarea xik din Qk n Qk .

Soluia (mulimea maximal independent) se va obine n cazul

cnd Qk i Qk . Dac

rezult c mulimea S k a fost extins la

o etap precedent din contul adugrii unui vrf din Qk , de aceea nu

este maximal independent.


32 | P a g e

Prezena n

Qk a unui vrf x Qk : ( x) Qk

(**)

este un indicator pentru a efectua pasul de ntoarcere, deoarece n acest

caz Qk nu va deveni vid, indiferent de modul de selecie a vrfurilor.

Optimizarea algoritmului
Optimizarea poate fi obinut din contul apariiei ct mai rapide
a pasului de ntoarcere. Prin urmare se va ncerca ndeplinirea ct mai
grabnic a condiiei (**). O metod sigur (n special pentru grafuri

mari) este de a alege mai nti n Qk un vrf x , pentru care mrimea

( x) ( x) Qk va fi minimal, apoi, la fiecare pas urmtor n


alegerea unui xik din Qk

: xik ( x) . Aceasta asigur apropierea cu o

unitate de situaia care genereaz pasul de ntoarcere.

Pseudocod
Pas 1.

S0 Q0 , Q0 V , k 0.

Adugarea vrfurilor
Pas 2. Este selectat un vrf

xik Qk , dup principiul formulat

anterior. Se formeaz Sk 1 , Qk 1 , Qk 1 fr a modifica Qk , Qk .

k
Verificarea posibilitii de continuare

Pas 3. Dac exist x Qk

: ( x) Qk

se trece la pasul 5,

altfel - la pasul 4.
Pas 4.
a)

Dac Qk i Qk se afieaz (memoreaz)

mulimea maximal independent S k i se trece la pasul 5.


b)

Dac Qk , dar Qk se trece direct la pasul 5

33 | P a g e

c)

Dac Qk , i Qk se revine la pasul 2

Micarea napoi
Pas 5. k
a)

xik se exclude din Sk 1 , pentru a reveni la S k .

b)

Se reconstruiesc Qk , Qk : Qk Qk xik

c)

Dac k 0 i Qk , atunci SFRIT (au fost afiate

Qk xik

[memorate] toate mulimile independente maximale). n


caz contrar se revine la pasul 3.

Implementare. n urmtorul exemplu este realizat o implementare


simplificat a algoritmului, fr optimizarea prin reordonarea
vrfurilor. Generarea repetat a mulimilor maximal independente este
evitat prin selectarea vrfurilor pentru includere n ordine

lexicografic. Mulimile Qk , Qk , Sk se formeaz i se gestioneaz prin

intermediul

apelurilor

recursive.

Restriciile

de

dimensiune

V num_el . Structurile de date: a matricea de adiacen a grafului,


s tabloul etichetelor vrfurilor, incluse n soluia curent (s[i]=1), q
tabloul etichetelor vrfurilor care pot fi adugate la soluie (q[i]=1),

rest tabloul etichetelor pentru restabilirea Qk .

int fillc(int *x, int z, int num)


{ // elementele cu tabloului x primesc valoarea z}
int readdata()
{ // citirea matricei de adiacen a grafului A}
int print()
{ // funcia pentru afiarea mulimii maximal independente
curente}
int mind(int *s, int *q)
{ int i,j,k=0,r, rest[num_el];
for (i=1;i<=n;i++) if(q[i]!=0) k=1;
if (k==0) {print();} // afiarea soluiei
34 | P a g e

else { j=n;
while (s[j]==0 && j>=1) j--;
r=j+1;
for (i=r;i<=n;i++)
if (q[i]==1)
{ fillc(rest,0,n);
s[i]=1; q[i]=0;
for (j=1;j<=n;j++)
if (a[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
// micarea inainte
s[i]=0;q[i]=1; //micarea napoi
for (j=1;j<=n;j++)
if(rest[j]==1) q[j]=1;
}
}
return 0;
}
int main()
{
readdata();
fillc(s,0,n); fillc(q,1,n);
mind(s,q); return 0;
}

Pentru graful reprezentat pe desenul 3.2, programul determin


urmtoarele mulimi maximal independente
1
1
1
1
2
2
2
2
2
3
4
6
8

5 10
7 8
8 10
9 10
3 7 8 11
3 9 11
4 6 9
4 7
6 9 11
5
6 9 10
9 10 11
10 11

Des. 3.2 Graful iniial i mulimile independente identificate.

35 | P a g e

3.3 Mulimi dominante


Fie dat un graf orientat G (V , E ) .
Def.

Mulime dominant sau mulime exterior stabil se numete o


mulime S V : x j S

( xi , x j ), xi S .

Formulat matematic, mulimea S este una dominant, dac:

(S ) V .

Def.

Mulimea dominant S se numete minim, dac nu exist o


alt mulime dominant S , pentru care se ndeplinete condiia:

S S .

Des. 3.3. {4,5,6} {3,8,7,5,4} {3,5,1} mulimi


dominante. Mulimile {3,5,1} , {4,5,6} sunt
minime dominante, iar {1,2,4,6,7} nu.

Nu toate mulimile minime


dominante au acelai numr de
vrfuri. Prin urmare modul de selecie a celei mai bune mulimi minime
dominante va depinde de condiiile iniiale ale problemei cercetate.
Def.

Fie Q mulimea tuturor mulimilor dominante ale grafului

G (V , E ) . Numrul G min Q
SQ

se va numi indice de

dominan a grafului G , iar mulimea S * , pentru care el se


obine mulime dominant de putere minim.
Legtura dintre mulimile maxim independente i mulimile
dominante este evident. Algoritmul folosit pentru determinarea

36 | P a g e

mulimilor dominante va fi organizat dup o tehnic similar celui


descris n 3.2.
Teorem: O mulime de vrfuri a grafului este maxim independent
atunci i numai atunci cnd este una dominant.

Necesitate. Fie S (S V ) maxim independent. Fie c S nu e


dominant. Atunci v V : v S

(S ) . Rezult c S

este

independent, ceea ce contrazice presupunerea iniial.


Suficien. Fie S (S V ) dominant. Presupunem c S nu e maxim
independent. Atunci v V astfel nct nu exist nici o (u, v) : u S .
Rezult c S nu
iniial.

este dominant, ceea ce contrazice presupunerea

37 | P a g e

Exerciii
1. Pentru graful din imagine, determinai:
a) Mulimea maxim
independent de putere
minim
b) Mulimea maxim
independent de putere
maxim
c) Una dintre mulimile dominante
2. Completai implementarea prezentat cu subprogramele lips i
structurile de date pentru a obine un program funcional, care
va realiza algoritmul pentru grafuri cu |V| < 30.
3. Realizai o modificare a programului, care va verifica toate
optimizrile indicate n descrierea algoritmului (3.2)
4. Implementai un algoritm similar celui pentru determinarea
mulimii maxim independente, care va construi mulimile
dominante pe un graf orientat.
5. Elaborai o funcie pentru generarea aleatorie a grafurilor i
estimai statistic timpul mediu de lucru al algoritmilor realizai
n dependen de numrul de vrfuri ale grafului

38 | P a g e

Capitolul 4. Colorri
n acest capitol:

Numrul cromatic al grafului


Teoreme cu privire la colorarea grafurilor
Algoritmi exaci de colorare a grafurilor
Algoritmi euristici de colorare

4.1 Numrul cromatic


Colorarea grafului procesul de atribuire unor caracteristici
coloristice vrfurilor acestuia.
Graful se numete r-cromatic, dac vrfurile lui pot fi colorate,
folosind r culori diferite, astfel nct s nu existe dou vrfuri adiacente,
colorate la fel. Valoarea minim a lui r, pentru care o asemenea colorare
este posibil se numete numr cromatic al grafului G (V , E ) i se
noteaz

(G) .

Nu exist o formul general pentru determinarea

(G) reieind

din numrul de vrfuri (n) i muchii (m) ale grafului. Este evident
k
posibilitatea
de
a
colora
graful
n
culori
(

(G) k n ). Totui, reieind din faptul c vrfurile colorate

formeaz mulimi independente, pot fi stabilite anumite numere


cromatice:

( Kn ) 1, ( Kn ) n , ( Kn ,n ) 2 , (T ) 2 , etc.
1

ntr-un graf colorat, mulimea vrfurilor, crora le este atribuit


una i aceeai culoare se numete clas monocrom.
Teorema 1.

(G) 1 (G). 6

Inducie dup numrul de vrfuri n.


6

(G) - puterea maxim a vrfurilor din G.


39 | P a g e

(G) 1 , (G) 0 . 1=1.


b) Fie G (V , E ) : V k (G) 1 (G).
a) Dac n=1,

c)

V k.

Pentru

un

vrf

arbitrar

v V are

loc

relaia:

(G v) (G v) 1 (G) 1. Puterea v nu depete (G) .


Prin urmare cel puin una din (G) 1 culori este liber pentru

v . Folosind anume o culoare liber se obine colorarea grafului


cu (G) 1 culori.
Teorema 2. Fie (G), (G) . Atunci sunt adevrate relaiile:

2 n n 1
n 1
n

a) Fie

(G) k i V1 ,V2 ,...,Vk - clase monocrome. Vi pi .

Prin

urmare,

max pi
i 1

n
.
k

Deoarece

Vi

sunt

p
i 1

n.

mulimi

independente, n G ele vor forma subgrafuri complete. Rezult


k

c max pi
1

n
n
. Astfel, k n .
k
k

b) Se tie c media geometric nu depete media aritmetic:

ab
ab
2 2 n
2
. Prin urmare,
c) Prin inducie dup n se va demonstra c p 1 .
Pasul 1. n 1, 1& 1 .
Pasul k-1. Fie k pentru toate grafurile cu k 1 vrfuri.
Pasul k. Fie G cu k vrfuri i un vrf v V . Atunci

(G) (G v) 1. Respectiv (G) (G v) 1. Dac


(G) (G v) 1 sau (G) (G v) 1 atunci
40 | P a g e

(G) (G) (G v) 1 (G v) 1 k 2 . Deoarece


exist cel puin o relaie < rezult k 1 .
Fie

(G) (G v) 1 i (G) (G v) 1 . Se consider

d d (v) n G . Respectiv n G gradul vrfului va fi d k 1 d .


n continuare, d (G v) ,7 i d k 1 d (G v) .
Atunci

(G) (G) (G v) 1 (G v) 1 d 1 k d 1 1 k 1
n 1
d) Din a) c) 2 n 1. Prin urmare
.
2
2

Teorema 3 n orice graf planar exist un vrf de grad nu mai mare


dect cinci. (corolar din formula Euler)
Fie v,

d (v) 6 . Atunci 6n d (v) 2m . Rezult 3n m . Dar


vV

m 3n 6 . Prin urmare 3n 3n 6 - contrazicere.


Teorema (celor 5 culori) Pentru orice graf planar

(G) 5 .

Este suficient s se cerceteze grafurile planare conexe, deoarece ntre


componentele izolate nu exist legturi.
Demonstraia va fi realizat prin inducie, dup numrul de vrfuri.
Pasul 0. dac n 5 (G) 5 .
Pasul k. Fie teorema este adevrat pentru toate grafurile planare cu k
vrfuri.
Pasul k+1. Se va cerceta graful G cu k 1 vrfuri. Conform corolarului
din formula Euler, n G exist un vrf v : d (v) 5 . Conform pasului
precedent al induciei,

(G v) 5 . Se va colora vrful v .

S-a presupus c (G) (G v) 1 . Dac d (G v) atunci vrful v poate fi


colorat n oricare din culorile libere: (G v) d . Astfel se va obine o colorare
(G v) a grafului G .

41 | P a g e

a) Dac d (v) 5 , atunci exist cel puin o culoare liber pentru


colorarea v .
b) Dac d (v) 5 , dar pentru (v) nu sunt folosite cinci culori
distincte, atunci exist o culoare liber pentru colorarea v
c) Dac d (v) 5 , i pentru (v) sunt folosite toate cinci culori, se
va ncerca recolorarea vrfurilor. Fie v1 ,..., v5 - vrfurile din

(v) i v i are culoarea i . Prin G1,3 se va nota subgraful generat


de vrfurile colorate n culorile 1 sau 3 pe colorarea de 5 culori a
grafului G v . Dac v1 i v 3 se afl n componente de conexitate
diferite a G1,3 , n componenta n care se afl v1 recolorm 1 3
pe toate vrfurile. G v va rmne 5-colorat, dar culoarea 1 va fi
liber pentru v . Dac v1 i v 3 se afl n aceeai component de
conexitate a G1,3 , exist o alt pereche de vrfuri care se afl n
componente diferite de conexitate ( G este planar). Fie v 2 i v 4 se
afl n componente diferite de conexitate a G2, 4 . n componenta
n care se afl v 2 recolorm 2 4 pe toate vrfurile. G v va
rmne 5-colorat, dar culoarea 2 va fi liber pentru v .
Ipoteza (celor 4 culori) Orice graf planar poate fi colorat cu patru
culori.

4.2. Algoritmul exact de colorare


Abordare recursiv, pseudocod.
Input: Graful G
Output: Toate colorrile posibile ale grafului G
Pas 0. k 0 (indicele culorii curente)
Pas 1. n graful G se alege o careva mulime maximal independent S .
Pas 2. k . Mulimea S se coloreaz n culoarea k .
Pas 3. G G S . Dac G se revine la pasul 1.
42 | P a g e

Algoritmul genereaz toate posibilitile de formare a mulimilor


independente disjuncte pe vrfurile grafului G . Prin urmare va fi
generat i o colorare optim cu numr minim de culori. Complexitatea
algoritmului este una exponenial pasul 1 are o asemenea
complexitate, deoarece genereaz mulimi maximal independente.
Suplimentar, se formeaz i un arbore de soluii, numrul de noduri n
care, n general este proporional cu 2n .
Cele expuse denot ineficiena algoritmului exact pentru
grafurile cu un numr mare de vrfuri.

4.3. Algoritmi euristici de colorare


Algoritmul exact, descris anterior nu poate fi utilizat pentru a
obine o colorare eficient n timp redus. Problema poate fi rezolvat cu
ajutorul unor algoritmi euristici, care vor furniza soluii ce pot diferi de
cea optim, fiind totui, destul de apropiate de ea.

Algoritmul de colorare consecutiv


Input: Graful G
Output: O colorare posibil a grafului G
Pas 1. Se sorteaz vrfurile din G n ordinea descreterii gradelor d .
Pas 2.

Iniializare V {1,..., n} C [ ] 0,
se

Pas 3.

iniializeaz

cu

0.

k 1 . Vectorul culorilor

Culoarea

activ

1.

Ct V se repet
Pentru fiecare v V
Pentru fiecare u (v)
Dac C [u ] k , se trece la urmtorul v

C[v] k ; V V v

k
43 | P a g e

Implementare
Input: Graful G : matricea de adiacen a, structura vrfurilor v.
Output: O colorare posibil a grafului G , n vectorul culorilor c.
int sort ()
{ // sorteaz vrfurile n descreterea gradelor }
int readdata()
{ // citete graful G. matricea de adiacen }
int printcc()
{ // afieaz o colorare a grafului G }
int nocolor()
{ verific prezena vrfurilor necolorate }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
// initializare
for (i=1;i<=n;i++)
{v[i].ind=i;
for (j=1; j<=n;j++) v[i].grad+=a[i][j];
}
// sortare
sort();
// colorare
k=1;
fillc(c,0,n);
while (nocolor())
{ for( i=1;i<=n;i++)
{ if (c[v[i].ind]==0)
{ r=0;
for (j=1;j<=n;j++)
if (a[v[i].ind][j] != 0 && c[j]==k) r++;
if (r==0) c[v[i].ind]=k;
}
}
k++;
}
printcc();
return 0;
}
44 | P a g e

Exerciii:
1. Pentru grafurile din imagine determinai

(G)

2. Elaborai un program care va determina colorarea minim


pentru grafuri cu V 10 . Implementai algoritmul exact de
colorare.
3. Elaborai

un

program

care

va

determina

colorarea

aproximativ pentru grafuri cu V 100 , folosind algoritmul


euristic de colorare.
4. Construii grafuri, pentru care algoritmul euristic, descris
anterior va construi o soluie diferit de cea optim.

45 | P a g e

Capitolul 5. Drumuri minime n graf


n acest capitol:

Drumul minim ntre dou vrfuri ale grafului


Drumul minim de la un vrf la toate vrfurile grafului (algoritmul Dijkstra)
Drumul minim ntre toate perechile de vrfuri (algoritmul Floyd)

Preliminarii
Ponderea unei muchii

(u, v) n graf este o caracteristic

numeric a relaiei ntre vrfurile u i v . Ea poate specifica distana


dintre vrfuri, sau capacitatea unui canal de transmitere a datelor, a
unei conducte, magistrale auto, etc. Atribuirea ponderilor la muchiile
unui graf permite formularea unei serii noi de probleme, inclusiv
probleme de optimizare. Una dintre aceste probleme este problema
drumurilor minime.
Problema drumurilor minime ntr-un graf arbitrar G (V , E ) ,
muchiile cruia au ponderi nenegative descrise de matricea costurilor
C C[i, j ] este de a determina un drum de lungime minim ntre dou
vrfuri date s i t ale grafului, n condiia c un asemenea drum exist.
Pentru problema dat exist mai multe formulri. Iat doar cteva din
ele:
S se determine distana minim ntre dou vrfuri ale
grafului (dac ntre ele exist un drum);
S se determine distana minim de la un vrf al grafului la
toate celelalte vrfuri;
S se determine distanele minimale ntre toate perechile de
vrfuri.

46 | P a g e

5.1 Distana minim ntre dou vrfuri. Algoritmul Dijkstra


Algoritmul Dijkstra se bazeaz pe aplicarea marcajelor
pentru vrfurile n care se poate ajunge dintr-un vrf dat. Iniial
marcajele au valori temporare suficient de mari, care pe parcursul
repetrii iteraiilor se micoreaz, pn la atingerea valorilor
minime. La fiecare iteraie a algoritmului, exact un dintre
marcaje devine permanent, adic indic drumul minim pn la
unul dintre vrfuri. Prin urmare algoritmul va conine cel mult n
iteraii.
Fie s vrful de la care se calculeaz distanele minime, t
vrful pn la care se calculeaz distana. Pentru vrful vi
marcajul su va fi notat prin l vi . Se va folosi un marcaj cu dou
componente (spre deosebire de algoritmul clasic Dijkstra).
Componentele vor conine a) valoarea distanei curente de la s la

vi i b) indicele vrfului v j din care se ajunge n vi .


Pseudocod
Pas 1. Se consider l s (0, s) marcaj temporar pentru vrful s.
Pentru toate vrfurile vi V , vi s se consider marcajele
nedefinite. Vrful activ p s .
Pas 2. (Recalcularea marcajelor)
Pentru

toate

vrfurile

vi ( p)

care

nu

permanente, se recalculeaz componentele


marcajelor n corespundere cu formula:

au

marcaje

distan

ale

l vi .dist min l vi .dist , l p .dist c p vi .

47 | P a g e

Dac

l vi .dist l p .dist c p vi atunci

se

modific

componenta marcajului, care indic sursa l vi .sursa p .


Vrfului p i se atribuie marcaj permanent.
Pas 3. (Determinarea vrfului pentru cercetare)
ntre toate vrfurile cu marcaje temporare se determin cel cu
marcaj minim pentru componenta distan:

l vi* .dist min l vi .dist


*
Se consider p vi

Pas 4. (Repetarea iteraiei)


Dac p = t atunci

marcajul l t .dist indic costul minim a

drumului di s n t. Pentru restabilirea drumului minim se trece


la pasul 5. n caz contrar p t se revine la pasul 2.
Pas 5. Pentru restabilirea traiectoriei se folosete a doua component
a marcajului: se consider x t .
Se include n traiectorie muchia

x, l x .sursa . Se

consider

x l x .sursa Procesul se repet ct timp x s .


Demonstrarea corectitudinii
Teorem. Algoritmul descris determin corect distana minim ntre
orice pereche de vrfuri s i t.

Fie la un careva pas marcajele permanente indic distanele


minime pentru vrfurile dintr-o submulime S1 V . S2 V / S1
Se presupune contrariul: pentru un careva v
*

minim din s ctre v trece prin S 2 .

48 | P a g e

din S drumul

Fie v j

primul punct din S 2 , care


*

aparine drumului minim ( s, v ) , vl ultimul


punct din S 2 , care aparine drumului minim

( s, v* ) . De asemenea, fie vi ultimul punct din


S1 pn la prsire, iar vk primul punct din S1 dup revenirea
drumului minim ctre vrfurile din aceast mulime. Drumul minim

l (vi , vk ) aparine integral S1 . La fel drumurile minime l (s, vi ) i


l (vk , v* ) aparin integral S1 . Deoarece drumul minim din vi n vk trece
doar prin S1 rezult c l (vi , vk ) c[i][ j ] l (v j , vl ) c[l ][k ] .
Atunci

l (s, v* ) l s, vi c[i][ j ] l v j , vl c[l ][k ] l vk , v* l s, vi l vi , vk l vk , v*

Prin urmare l ( s, v ) nu este drum minim, ceea ce contrazice


presupunerea iniial.
Exemplu:
Fie dat graful G (V , E ) (desenul
5.2)

Des. 5.2

Se cere s se determine distana minim de la vrful 1 la vrful 10.


Iniializarea
Vrf
distana
sursa
marcaj

1
0
1
p

10

49 | P a g e

Iteraia 1
Vrf
distana
sursa
marcaj

1
0
1
p

2
10

Iteraia 2
Vrf
distana
sursa

1
0
1

2
10

marcaj

Iteraia 3
Vrf
distana
sursa
marcaj

1
0
1
p

Iteraia 4
Vrf
distana
sursa
marcaj

1
0
1
p

Iteraia 5
Vrf
distana
sursa
marcaj

1
0
1
p

Iteraia 6
Vrf
distana
sursa
marcaj

1
0
1
p

Iteraia 7
Vrf
distana
sursa
marcaj

1
0
1
p

50 | P a g e

1
t

4
5

1
t*
3

5
10

1
t*

7
6

10

7
6

8
10

10

1
t
*

7
6

8
10

10

1
p

4
t
9

10

10
30
5
t

1
t

4
5

2
10

4
5

5
10

1
p

4
t

2
10

3
30

4
5

5
10

6
18

7
6

8
10

1
p

2
t

1
p

4
t*

2
t

1
p

4
t

2
10

3
30

4
5

5
10

6
18

7
6

8
10

1
p

2
t

1
p

4
p

2
t

1
p

4
t*

2
10

3
30

4
5

5
10

6
18

7
6

8
10

9
30

10
30

1
p

2
t

1
p

4
p

2
t*

1
p

4
p

8
t

5
t

2
10

3
30

4
5

5
10

6
18

7
6

8
10

9
30

10
24

1
p

2
t

1
p

4
p

2
p

1
p

4
p

8
t

6
t*

Lungimea drumului minim din vrful 1 n 10 este 24. Traseul va


fi determinat de calea: 10, 6, 2, 1
Pentru a determina distanele minime de la un vrf dat pn la
toate celelalte vrfuri ale grafului (a componentei conexe) algoritmul va
fi oprit n cazul cnd toate vrfurile au marcaje permanente.

Implementare
Graful este descris prin matricea de adiacen a. Marcajele se pstreaz
n tabloul liniar vert cu elemente tip articol, avnd componentele
distana, sursa, stare.
int find()
{ // fuctia returneaza indicele varfului cu marcaj temporar
//de valoare minima. Daca nu exista, returneaza 0.
}
int tipar()
{ // functia afiseaza tabloul de marcaje
}
int main()
{ // citire date
// formare marcaje
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++) k+=a[i][j];
k++;
for (i=1;i<=n;i++)
{vert[i].dist=k; vert[i].sursa=i; vert[i].stare=0;}
vert[s].stare=1; vert[s].dist=0;
// repetare iteratii
while (find ())
{ p=find();
for(i=1;i<=n;i++)
if (a[p][i] !=0 && vert[i].stare !=2 )
{ dc= vert[p].dist+a[p][i];
if(dc<vert[i].dist){vert[i].dist=dc; vert[i].sursa=p;}
vert[i].stare=1;
51 | P a g e

}
vert[p].stare=2;
}
// afisare rezultate
tipar();
return 0;
}

5.2 Distana minim ntre toate vrfurile. Algoritmul Floyd


Din paragraful precedent rezult o soluie evident a problemei
determinrii tuturor drumurilor minime ntre vrfurile grafului:
algoritmul Dijkstra se lanseaz avnd n calitate de surs consecutiv,
toate vrfurile grafului. Eist i un algoritm mai eficient, propus de
Floyd [7, p. 480]. La baza algoritmului este ideea unei secvene din n
transformri consecutive ale matricei distanelor C. La transformarea
cu indicele k matricea conine lungimea drumului minim ntre orice
pereche de vrfuri, cu restricia c pentru orice dou vrfuri vi ,

vj

drumul minim dintre ele trece doar prin vrfurile mulimii {v1 , v2 ,..., vk }

Pseudocod
Pas 0. (Preprocesare). Fie dat matricea distanelor C, n care

i j
0,

C[i ][ j ] di , j , (i, j ) E
,
(i, j ) E

Pas 1. (Iniializare) k 0
Pas 2

Pas 3

Pentru toi i k : C[i][k ] , i pentru toi j k : C[k ][ j ] se


calculeaz C[i][ j ] min C[i][ j ], C[i][k ] C[k ][ j ]

Pas 4

dac k n sfrit, n caz contrar se revene la pasul 2.

52 | P a g e

Dac problema rezolvat necesit i restabilirea traseelor care


formeaz drumurile minime, este format o matrice auxiliar T, care
iniial are elementele liniei i egale cu i.
Mai apoi, la transformarea elementului C[i][ j ] din matricea
distanelor se transform i elementul respectiv din matricea T:

T [i][ j ] T [k ][ j ] dac C[i][ j ] C[i][k ] C[k ][ j ] .


Traseul ce corespunde drumului minim ntre vrfurile vi ,

v j va

fi format din secvena vi , v1 , v2 ,..., vr , vr 1 , v j , unde

vr 1 T [i][ j ], vr T [i][vr 1 ], vr 1 T [i][vr ],...


Implementare
Graful este descris prin matricea de adiacen a, care ulterior
este transformat n matricea distanelor.
int main()
{
// citire date iniiale
// modelare infinit
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
p+=a[i][j];
p++;
// creare matrice costuri
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==0 && i != j) a[i][j]=p;
// calculare drumuri minime
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
if (i!=k && a[i][k]!=p)
for (j=1;j<=n;j++)
if (j!=k && a[k][j] !=p)
if (a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
// afisare rezultate
return 0;
}
53 | P a g e

Exerciii
1. Determinai distana minim ntre vrfurile indicate pe grafurile
de mai jos:
39
14

2. Pentru implementarea algoritmului Dijkstra, propus n 5.1


elaborai o funcie pentru restabilirea lanului care corespunde
drumului minim de la vrful dat s ctre destinaia t.
3. Realizai o implementare a algoritmului Floyd (5.2) fr
matricea auxiliar pentru restabilirea lanurilor care corespund
drumurilor minime.
4. Extindei implementarea din exerciiul 2, adugnd opiunea de
restabilire a lanurilor care corespund drumurilor minime.
5. Estimai complexitatea algoritmului Dijkstra.
6. Estimai complexitatea algoritmului Floyd.

54 | P a g e

Capitolul 6. Centre n graf


n acest capitol:

Centre n graf
Centre interioare i exterioare
Raza grafului
Algoritmi exaci pentru determinarea centrului
Centrul absolut
P centru
Algoritmi euristici pentru determinarea p-centrelor

n activitatea practic deseori apar probleme de amplasare


optim a unor puncte de deservire (staii, puncte de control, utilaj) ntro reea de localiti, ncperi etc. Punctele pot fi unul sau cteva, n
dependen de condiiile problemei. Formulat n termeni uzuali,
problema este de a gsi un punct, care ar minimiza suma distanelor de
la oricare alt punct al reelei pn la el, sau n termenii teoriei
grafurilor - de a determina vrful grafului sau punctul geometric, care
aparine unei muchii, astfel nct acesta va minimiza suma distanelor
pn la toate celelalte vrfuri a grafului. Se va considera suplimentar,
c drumurile pentru localitile (vrfurile) situate pe acelai lan sunt
distincte.

6.1 Divizri
0
Pentru orice vrf vi al grafului G (V , E ) se va nota prin R (vi )

mulimea de vrfuri v j ale grafului G care pot fi atinse din vi prin ci


t
care nu depesc mrimea . Prin R (vi ) se va nota mulimea de

vrfuri v j ale grafului G din care vi poate fi atins prin ci care nu

55 | P a g e

depesc mrimea . Astfel, pentru orice vrf vi al grafului G se


noteaz:

R (v ) v : d v , v , v V
R0 (vi ) v j : d vi , v j , v j V
t

Pentru fiecare din vrfurile vi vor fi definite 2 mrimi

s0 (vi ) max d vi , v j
v j V

st (vi ) max d v j , vi
v j V

valorile s0 (vi ) i st (vi ) se numesc indici de separare exterior i


respectiv interior ai vrfului vi .
Exemplu:

v1

v2

v3

v4

v5

v6

v7

v8

s0

v1

v2

v3

v4

v5

2
*

v6

v7

pentru vrful vi , s0 (vi ) va fi

v8

determinat de valoarea
maxim din rndul i al

st

3
*

3
*

Des. 6.1 Graf tare conex i matricea


distanelor lui.

Este

evident,

matricei distanelor, iar st (vi ) - de valoarea maxim din coloana i. Tot


de aici rezult c valorile s0 (vi ) i st (vi ) au valori finite pentru orice i
numai dac graful este tare conex.
56 | P a g e

6.2 Centrul i raza grafului


Def.

*
Vrful v0 pentru care are loc relaia s0 (v0 ) min s0 (vi ) se

vi V

numete centru exterior al grafului G. Vrful vt* pentru care are


loc relaia st (vt ) min st (vi ) se numete centru interior al
*

vi V

grafului G.
Centrul exterior este vrful (sau vrfurile) care minimizeaz cea
mai lung distan de la el spre oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare linie. Pentru graful de pe desenul 6.1 centrul exterior este
vrful 5. Centrul interior este vrful (sau vrfurile) care minimizeaz
cea mai lung distan spre el de la oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare coloan. Pentru graful de pe desenul 6.1 centre exterioare
sunt vrfurile 4 i 8. ntr-un graf neorientat centrul interior i cel
exterior coincid.
Def.

Valoarea s0 (v0 ) min s0 (vi ) se numete raza exterioar a


*

vi V

grafului G. Valoarea st (vt ) min st (vi ) se numete raza


*

vi V

interioar a grafului G.
Pentru graful de pe desenul 6.1 raza exterioar are valoarea 2, n
timp ce raza interioar are valoarea 3.
Pentru un graf neorientat raza interioar i raza exterioar sunt
egale, iar centrele exterioare coincid cu cele interioare.
Def.

Valoarea s(v0 ) min s(vi ) se numete raza grafului neorientat


*

vi V

G. Valoarea st (v ) min st (vi ) se numete raza interioar a


*
t

vi V

grafului G.

57 | P a g e

Def.

*
Vrful v0 pentru care are loc relaia s(v0 ) min s(vi ) se numete

vi V

centru al grafului neorientat G.

6.3 P-centre
Fie n municipiu sunt amplasate mai multe (P) centre de
asisten medical urgent, cu echipe mobile de medici. n cazul
recepionrii unei cereri de asisten la centrul comun de apel, ctre
solicitant se deplaseaz echipajul de medici de la cel mai apropiat
centru de asisten.
n acest caz amplasarea iniial a celor P centre de asisten
medical urgent este organizat ntr-un mod, care asigur minimul de
ateptare a pacientului, indiferent de locaia acestuia.

Fie V p o submulime din V . Vp p . Prin d Vp , vi se va nota


distana de la cel mai apropiat vrf din V p pn la vrful vi :

d Vp , vi min d v j , vi
v j V p

La fel, prin d vi ,Vp se va nota distana de la vrful vi pn la

cel mai apropiat vrf din V p : d vi ,Vp min d vi , v j


v j V p

Indicii de separare pentru mulimea V p se calculeaz la fel ca i pentru


vrfurile solitare:

s0 (V p ) max d V p , v j
v j V

st (Vp ) max d v j ,Vp


v j V

Def.

Mulimea

de

vrfuri

V p*,0

pentru

care

are

loc

relaia

s0 (Vp*,0 ) min s0 (Vp ) se numete p-centru exterior al grafului G.


V p G

Mulimea de vrfuri

V p*,t

pentru care are loc relaia

st (Vp*,t ) min st (Vp ) se numete p-centru interior al grafului G.


V p G

58 | P a g e

Def.

Valoarea s0 (Vp ,0 ) min s0 (Vp ) se numete p-raza exterioar a


*

V p G

grafului G. Valoarea st (Vp ,t ) min st (Vp ) se numete p-raza


*

V p G

interioar a grafului G.

Algoritmul euristic pentru determinarea p-centrelor


Algoritmul face parte din clasa algoritmilor de optimizare local,
care se bazeaz pe ideea optimizrii pe grafuri.
Fie graful neorientat G (V , E ) . O mulime de vrfuri S V ,

S p se numete optim p pentru problema Q, dac nlocuirea


oricror vrfuri din S cu vrfuri din V S nu va mbunti
soluia problemei Q, obinut pe mulimea S . Algoritmul descris este
unul general i poate fi folosit pentru diverse probleme formulate pe
grafuri.
Iniial n calitate de soluie este selectat o mulime arbitrar de
vrfuri C, care aproximeaz p centrul. Apoi se verific, dac un careva
vrf v j V C poate nlocui vrful vi C . Pentru aceasta se formeaz

mulimea C C v j vi dup care se compar s(C ) i s(C ) .


Ulterior C este cercetat n acelai mod , pentru a obine C . Procesul
se repet pn la obinerea unei mulimi C , pentru care nu mai pot fi
efectuate mbuntiri prin procedeul descris. Mulimea de vrfuri C
este considerat p-centrul cutat.

Pseudocod
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd)
Pas 1. Se alege n calitate de aproximare iniial a p-centrului o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).

59 | P a g e

Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare


vrf vi C se calculeaz valorile i , j s(C ) s(C {vi } {v j })
Pas 3. Se determin

i0 , j max i , j .
vi C

Dac i0 , j 0 vrful v j este marcat verificat (i se aplic

i.

marcajul de stare - 1) i se revine la pasul 2.


ii.

Dac i0 , j 0 , C C {vi } {v j } vrful v j este marcat


verificat (i se aplic marcajul de stare - 1) i se revine la
pasul 2.

Pas 4. Paii 2 3 se repet att timp ct exist vrfuri cu marcaj de


stare 0. Dac la ultima repetare a pailor 2 3 nu au fost
efectuate nlocuiri (3.ii) se trece la pasul 5. n caz contrar
tuturor vrfurilor din V C li se atribuie marcajul de stare 0,
apoi se revine la pasul 2.
Pas 5. STOP. Mulimea de vrfuri curent C este o aproximare a pcentrului cutat.

6.4 Centrul absolut


n cazul modificrii restriciilor de amplasare a centrului,
problema determinrii acestuia poate s devin mult mai complicat.
Fie c urmeaz s fie construit un centru regional al serviciului
de ajutor tehnic, care va deservi n localiti. Acesta poate fi amplasat
att n una din localiti, ct i pe unul din traseele care le unesc. n
calitate de criteriu principal de selecie a locaiei pentru centru se
consider minimizarea distanei pn la cel mai ndeprtat punct
(localitate) deservit. Problema poate fi modelat pe un graf, vrfurile
cruia corespund localitilor, iar muchiile traseelor ntre localiti.
Ponderea fiecrei muchii este distana dintre localitile adiacente ei.
Locaia optim poate fi att n unul din vrfurile sau un vrf nou,
amplasat pe una din muchiile grafului iniial (desenul 6.2).
60 | P a g e

Des. 6.2
Amplasarea optim a centrului de deservire:
a. Numai pe vrfurile existente
b. Pe vrfurile sau muchiile existente

Fie (vi , v j ) muchia cu ponderea ci , j . Un punct interior u al


acestei muchii poate fi descris prin intermediul lungimilor l (vi , u ) i

l (u, v j ) a segmentelor vi , u , respectiv u, v j innd cont de relaia:


l (vi , u) l (u, v j ) ci , j
n punctul u se va defini un nou vrf al grafului, cu puterea 2,
adiacent vrfurilor vi i v j . Pentru u se vor calcula aceleai dou
valori:

s0 (u ) max d u, v j ,

st (u ) max d v j , u

v j V

Def.

v j V

*
Punctul u0 pentru care are loc relaia s0 (u0 ) min s0 (u) se

uG

*
numete centru exterior absolut al grafului G. Vrful ut pentru

care are loc relaia st (ut ) min st (u) se numete centru interior
*

uG

absolut al grafului G.
Def.

Valoarea s0 (u0 ) min s0 (u) se numete raza exterioar absolut


*

uG

a grafului G. Valoarea

st (ut* ) min st (u) se numete raza


uG

interioar absolut a grafului G.


Pentru graful reprezentat n figura 6.2 Centrul absolut va fi un
vrf suplimentar (5) poziionat pe muchia (2, 3) la distana 5 de vrful
2 i 25 de vrful 3. Pentru acest punct raza absolut va avea valoarea
25. Deplasarea punctului n stnga sau n dreapta va duce la creterea
razei.
61 | P a g e

6.5 Metoda Hakimi pentru determinarea centrului absolut


n cazul cnd problema iniial cere amplasarea centrelor de
deservire numai n anumite puncte (vrfuri ale grafului) problema se
rezolv nemijlocit, folosind matricea distanelor din graf, prin metode
descrise anterior. Dac ns se admite i amplasarea n puncte
interioare ale muchiilor grafului, atunci urmeaz s fie determinat
centrul absolut al grafului. n acest scop poate fi folosit metoda
propus de Hakimi [6, p. 104]:
1. Pentru fiecare muchie ek a grafului se va determina punctul (sau
punctele) u ek cu indicele de separare minim
2. Dintre toate punctele u ek se va alege u ek min u ek .
*

eE

Realizarea pasului doi este elementar. n continuare se va cerceta


pasul 1. Fie muchia ek ntre vrfurile vi i v j (desenul 6.3).

Des 6.3 Determinarea centrului absolut pe muchie

Indicii de separare a punctului u se calculeaz dup formula

s0 (u ) max d u, v j , st (u ) max d v j , u
v j V

v j V

Pentru punctul uk de pe muchia ek se obine

s(uk ) max d uk , vl max min{l (uk , v j ) d ( x j , xl ), l (uk , vi ) d ( xi , xl )}


vl V

62 | P a g e

vl V

deoarece drumurile minimale pn la celelalte vrfuri vor trece n mod


obligatoriu prin punctele vi sau v j . l (uk , v j ) i l (uk , vi ) sunt lungimile
componentelor muchiei ek , n care o divide uk .
Fie l (uk , v j ) . Atunci l (uk , vi ) ci , j iar formula precedent
capt forma:

s(uk ) max d uk , vl max min{ d ( x j , xl ), ci , j d ( xi , xl )}


vl V

vl V

Pentru orice elemente fixate vl i ek valoarea s uk poate fi


calculat ca o funcie liniar de variabila . Pentru aceasta sunt
separate expresiile:

Tl d (v j , vl )
Tl ci , j d (vi , vl )
i cercetate ca funcii de . Pentru graficele funciilor se determin
punctul de intersecie i semidreptele inferioare ce pornesc din el.
Aceste semidrepte se vor numi semidrepte de minimizare inferioare.
Semidreptele de minimizare se construiesc pentru toate vl V , apoi pe
baza lor se construiete linia de maximizare. Aceasta prezint o linie
frnt, cu mai multe puncte de minimum. Din toate punctele de
minimum este ales cel maximal (conform formulei.). Acesta va fi centrul
absolut situat pe muchia ek . Pentru a determina centrul absolut al
ntregului graf se va selecta minimul dintre centrele absolute pe toate
muchiile din G.

63 | P a g e

Exemplu

v1

v2

v3

v4

v5

v6

v1

v2

10

v3

10

10

v4

10

10

v5

0
v6 5 8 10 4 2
Des. 6.4.
Graful pentru care se calculeaz centrul absolut i matricea distanelor lui.
Pe muchia 1

T1 d (v3 , v1 ) 8;
T1 c3,1 d (v1 , v1 ) 8 .
T2 d (v3 , v2 ) 2;
T2 c3,1 d (v1 , v2 ) 17 .
T3 d (v3 , v3 ) ;
T3 c3,1 d (v1 , v3 ) 16 .
T4 d (v3 , v4 ) 10;
T4 c3,1 d (v1 , v4 ) 14 .
T5 d (v3 , v5 ) 8;
T5 c3,1 d (v1 , v5 ) 11 .
T6 d (v3 , v6 ) 10 ;
T6 c3,1 d (v1 , v6 ) 13 .
Des. 6.5.a

64 | P a g e

Pe muchia 2

T1 d (v3 , v1 ) 8;
T1 c3,2 d (v1 , v2 ) 11 .
T2 d (v3 , v2 ) 2;
T2 c3,2 d (v2 , v2 ) 2 .
T3 d (v3 , v3 ) ;
T3 c3,2 d (v3 , v2 ) 4 .
T4 d (v3 , v4 ) 10;
T4 c3,2 d (v2 , v4 ) 12 .
T5 d (v3 , v5 ) 8;
T5 c3,2 d (v2 , v5 ) 14 .
T6 d (v3 , v6 ) 10 ;
T6 c3,2 d (v2 , v6 ) 16 .

Des. 6.5.b

Pe muchia 3

T1 d (v2 , v1 ) 9;
T1 c5,2 d (v2 , v1 ) 9 .
T2 d (v2 , v2 ) ;
T2 c5,2 d (v5 , v2 ) 12 .
T3 d (v2 , v3 ) 2;
T3 c5,2 d (v5 , v3 ) 14 .
T4 d (v2 , v4 ) 10;
T4 c5,2 d (v5 , v4 ) 10 .
T5 d (v2 , v5 ) 6;
T5 c5,2 d (v5 , v5 ) 6 .
T6 d (v2 , v6 ) 8 ;
T6 c5,2 d (v5 , v6 ) 8 .

Des. 6.5.c

65 | P a g e

Pe muchia 4

T1 d (v1 , v1 ) ;
T1 c5,1 d (v5 , v1 ) 6 .
T2 d (v1 , v2 ) 9;
T2 c5,1 d (v5 , v2 ) 9 .
T3 d (v1 , v3 ) 8;
T3 c5,1 d (v5 , v3 ) 11 .
T4 d (v1 , v4 ) 6;
T4 c5,1 d (v5 , v4 ) 7 .
T5 d (v1 , v5 ) 3;
T5 c5,1 d (v5 , v5 ) 3 .
T6 d (v1 , v6 ) 5;
T6 c5,1 d (v5 , v6 ) 5 .
Des. 6.5.d
Pe muchia 5

T1 d (v1 , v1 ) ;
T1 c4,1 d (v4 , v1 ) 12 .
T2 d (v1 , v2 ) 9;
T2 c4,1 d (v4 , v2 ) 16 .
T3 d (v1 , v3 ) 8;
T3 c4,1 d (v4 , v3 ) 16 .
T4 d (v1 , v4 ) 6;
T4 c4,1 d (v4 , v4 ) 6 .
T5 d (v1 , v5 ) 3;
T5 c4,1 d (v4 , v5 ) 10 .
T6 d (v1 , v6 ) 5;
T6 c4,1 d (v4 , v6 ) 10 .

66 | P a g e

Des. 6.5.e

Pe muchia 6

T1 d (v5 , v1 ) 3;
T1 c4,5 d (v4 , v1 ) 10 .
T2 d (v5 , v2 ) 6;
T2 c4,5 d (v4 , v2 ) 14 .
T3 d (v5 , v3 ) 8;
T3 c4,5 d (v4 , v3 ) 14 .
T4 d (v5 , v4 ) 4;
T4 c4,5 d (v4 , v4 ) 4 .
T5 d (v5 , v5 ) ;
T5 c4,5 d (v4 , v5 ) 8 .
T6 d (v5 , v6 ) 2;
T6 c4,5 d (v4 , v6 ) 8 .

Des. 6.5.f

Pe muchia 7

T1 d (v6 , v1 ) 5;
T1 c4,6 d (v4 , v1 ) 10 .
T2 d (v6 , v2 ) 8;
T2 c4,6 d (v4 , v2 ) 14 .
T3 d (v6 , v3 ) 10;
T3 c4,6 d (v4 , v3 ) 14 .
T4 d (v6 , v4 ) 4;
T4 c4,6 d (v4 , v4 ) 4 .
T5 d (v6 , v5 ) 2;
T5 c4,6 d (v4 , v5 ) 8 .
T6 d (v6 , v6 ) ;
T6 c4,6 d (v4 , v6 ) 8 .

Des. 6.5.g

67 | P a g e

Pe muchia 8

T1 d (v6 , v1 ) 5;
T1 c5,6 d (v5 , v1 ) 5 .
T2 d (v6 , v2 ) 8;
T2 c5,6 d (v5 , v2 ) 8 .
T3 d (v6 , v3 ) 10;
T3 c5,6 d (v5 , v3 ) 10 .
T4 d (v6 , v4 ) 4;
T4 c5,6 d (v5 , v4 ) 6 .
T5 d (v6 , v5 ) 2;
T5 c5,6 d (v5 , v5 ) 2 .
T6 d (v6 , v6 ) ;
T6 c5,6 d (v5 , v6 ) 4 .

Des. 6.5.h

Pe muchia 9

T1 d (v4 , v1 ) 4;
T1 c4,3 d (v3 , v1 ) 18 .
T2 d (v4 , v2 ) 10;
T2 c4,3 d (v3 , v2 ) 12 .
T3 d (v4 , v3 ) 10;
T3 c4,3 d (v3 , v3 ) 10 .
T4 d (v4 , v4 ) ;
T4 c4,3 d (v3 , v4 ) 20 .
T5 d (v4 , v5 ) 4;
T5 c4,3 d (v3 , v5 ) 18 .
T6 d (v4 , v6 ) 4;
T6 c4,3 d (v3 , v6 ) 20 .
Des. 6.5.i

68 | P a g e

Indicele de separare cu valoare minim se obine pe muchia e3 .


Valoarea minim este 6 (desenul 6.5.c) i se obine n punctul aflat la
distana de 4 uniti de la vrful v2 (desenul 6.6).

Centrul absolut . Este amplasat la distana 4 uniti de vrful 2 i 2 uniti de


vrful 5.

Des. 6.6 Amplasarea centrului absolut

69 | P a g e

Exerciii:

Des. 6.7.

1. Pentru grafurile de pe desenul 6.7 A, 6.7 B, determinai


vrfurile centru.

2. Elaborai un program pentru determinarea centrelor relative


exterioare i interioare ale unui graf orientat, descris prin
matricea sa de adiacen. |V| < 50.
3. Elaborai un program pentru determinarea centrelor relative ale
unui graf neorientat. |V| < 50.
4. Determinai 2-centrul pentru grafurile din imaginile 6.7 A, 6.7 B.
5. Determinai, folosind metoda Hakimi, centrele absolute ale
grafurilor din imaginile 6.7 A, 6.7 B.
6. Elaborai un program, care va determina cu o eroare ce nu
depete 1% centrul absolut al grafurilor cu |V|< 30, muchiile
crora au ponderi ntregi, mai mici dect 100. (Folosii metoda
trierii)

70 | P a g e

Capitolul 7. Mediane
n acest capitol:

Mediane n graf
Mediane interioare i exterioare
Algoritmi exaci pentru determinarea medianei
Mediana absolut
P mediana
Algoritmi euristici pentru determinarea p-medianei

7.1 Mediane
Mai multe probleme de amplasare a punctelor de deservire presupun minimizarea sumei distanelor de la o serie de puncte terminale
pn la un punct central (de colectare, comutare, depozite, etc.)
Punctele care corespund soluiei optime ale problemei se numesc
puncte mediane ale grafului.
Fie graful G (V , E ) . Pentru fiecare vrf vi se definesc dou
valori, care se numesc indici de transmitere:

0 (vi )
t (vi )

d v , v

v j V

d v , v

v j V

Aici d (vi , v j ) distana minim dintre vrfurile v j i vi . Valorile

0 vi i t vi se numesc indice interior i exterior de transmitere a


vrfului vi . Indicii de transmitere pot fi calculai din matricea
distanelor D(G): 0 vi ca suma elementelor din linia i a matricei D,
iar t vi ca suma elementelor din coloana i.

71 | P a g e

Def.

Vrful v0 pentru care 0 v0 min 0 vi se numete median


exterioar

grafului

vi V

G.

Vrful

vt

pentru

care

t vt min t vi se numete median interioar.


vi V

v1

v2

v3

v4

v5

v6

v7

v8

v1

15

v2

22

v3

16

v4

15

v5

10

v6

18

v7

21

v8

20

25

15

15

14

19

16

21

12

Exemplu: Fie graful din desenul 7.1:

Pentru exemplul prezentat mediana exterioar este vrful v5 cu


indicele de transmitere 10, mediana interioar vrful v8 cu indicele de
transmitere 12.
Algoritmul general pentru determinarea medianelor presupune
calculul distanelor minime ntre vrfurile grafului, ulterior calcularea
sumelor elementelor matricei pe linii (coloane) i selectarea minimului
din sumele calculate (minimul sumelor pe linii pentru mediana
exterioar, pe coloane pentru mediana interioar ).

72 | P a g e

7.2. Mediana absolut


La determinarea centrelor absolute n graf s-a observat c
amplasarea optim a acestora poate genera apariia unui vrf nou pe
una din muchiile grafului. n cazul medianei absolute situaia este
diferit:
Teorema 1. Pentru orice punct y al grafului G (V , E ) , va exista cel
puin un vrf v al grafului, pentru care

(v) ( y)

Dac y este vrf al grafului, teorema e demonstrat. n caz contrar: Fie


y un punct interior al muchiei (v , v ) situat la distana de v . n
acest caz d ( y, v j ) min d (v , v j ), c , d (v , v j )
Fie V mulimea vrfurilor pentru care d (v , v j ) c , d (v , v j )
iar V mulimea vrfurilor pentru care d (v , v j ) c , d (v , v j ) .
Atunci: ( y)

d ( y, v ) d (v , v ) c d (v , v )
j

v j V

v j V

v j V

Tot odat, d (v , v j ) c , d (v , v j ) (altfel nu ar fi distana minim)


Prin nlocuire n formula precedent se obine:

( y)

d (v , v ) d (v , v ) .
j

v j V

Deoarece V

( y)

V V , poate fi efectuat regruparea termenilor:

d (v , v ) V

v j V

v j V

V . Deoarece vrfurile v , v se aleg

arbitrar, v va fi vrful, pentru care V V . n final ( y) (v )


Pentru un graf neorientat mediana exterioar i cea interioar
coincid, prin urmare se cerceteaz doar noiunea de median, ca vrf,
care minimizeaz suma distanelor pn la celelalte vrfuri ale
grafului.

73 | P a g e

7.3 P-mediane
Noiunea de p-median se introduce prin analogie cu noiunea de
p-centru.

Fie V p o submulime din V . Vp p . Prin d Vp , vi se va nota


distana de la cel mai apropiat vrf din V p pn la vrful vi :

d Vp , vi min d v j , vi

(*)

v j Vp

La fel, prin d vi ,Vp se va nota distana de la vrful vi pn la

cel mai apropiat vrf din V p : d vi ,Vp min d vi , v j


v j Vp

(**)

Dac vj este vrful din V p , pentru care se obine valoarea minim a (*)
sau (**), se spune c vi este arondat la vj .
Indicii de transmitere pentru mulimea V p se calculeaz la fel ca i
pentru vrfurile solitare:

0 (Vp )
Def.

Mulimea

d V , v ,

v j V

de

vrfuri

V p ,0

t (Vp )
pentru

d v ,V

v j V

care

are

loc

relaia

0 (Vp ,0 ) min 0 (Vp ) se numete p-median exterioar a


Vp V

grafului G. Mulimea de vrfuri V p ,t pentru care are loc relaia

t (Vp ,t ) min t (Vp ) se


V p V

numete

p-median

interioar

grafului G.
Teorema 2. Pentru orice mulime Y

din p puncte ale grafului

G (V , E ) , va exista cel puin o mulime Vp V din p vrfuri ale


grafului, pentru care (Vp ) (Y )
Se demonstreaz similar Teoremei 1 din acest capitol.

74 | P a g e

Pentru un graf neorientat p-mediana exterioar i cea interioar


coincid, prin urmare se cerceteaz doar noiunea de p-median, ca
mulime de vrfuri, care minimizeaz suma distanelor pn la toate
celelalte vrfuri ale grafului.

7.3 Algoritmi pentru determinarea p-medianei


Algoritmul direct
Algoritmul direct presupune generarea tuturor submulimilor
din p vrfuri ale grafului G i selectarea mulimii V p pentru care

(Vp ) min (Vp ) . O asemenea abordare presupune cercetarea a Cnp


Vp V

mulimi, ceea ce necesit resurse exponeniale de timp pentru valori


mari ale n sau valori ale p apropiate de n/2. n particular, pentru valori
ale lui n,p, care nu depesc 20 poate fi folosit un algoritm clasic de
generare a submulimilor unei mulimi, descris n [9, p.32]. O
modificare elementar va permite generarea doar a mulimilor din p
elemente, ceea ca va reduce considerabil timpul de lucru al
algoritmului. O alt component a soluiei este calcularea matricei D a
distanelor minime, care va servi n calitate de surs de date pentru
determinarea p-medianei.

Algoritmul euristic
Pentru valori mari ale lui n i p poate fi folosit un algoritm
euristic, similar algoritmului pentru determinarea p-centrului.
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd)
Pas 1. Se alege n calitate de aproximare iniial a p-medianei o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare
vrf vi C se calculeaz valorile i , j (C ) (C {vi } {v j })

75 | P a g e

Pas 3. Se determin
iii.

i0 , j max i , j .
vi C

Dac i0 , j 0 vrful v j este marcat verificat (i se aplic


marcajul de stare - 1) i se revine la pasul 2.

Dac i0 , j 0 , C C {vi } {v j } vrful

iv.

v j este marcat

verificat (i se aplic marcajul de stare - 1) i se revine la


pasul 2.
Pas 4. Paii 2 3 se repet att timp ct exist vrfuri cu marcaj de
stare 0. Dac la ultima repetare a pailor 2 3 nu au fost
efectuate nlocuiri (3.ii) se trece la pasul 5. n caz contrar
tuturor vrfurilor din V C li se atribuie marcajul de stare 0,
apoi se revine la pasul 2.
Pas 5. STOP. Mulimea de vrfuri curent C este o aproximare a pmedianei cutate.

Implementare
Input: Graful

G : matricea de adiacen d, ulterior matricea

distanelor; vectorul p-medianei pmed, vectorul stare st.


Output: O p-median posibil a G , n vectorul pmed.
int tipar()
{// afieaz mediana curent }
int calcmed()
{ // calculeaz valoarea p-medianei curente }
int main()
{ // citire date
// modelare valoare infinit - p
// algoritmul Floyd. D matricea distanelor
// initializare p-mediana
for(i=1;i<=n; i++) st[i]=0;
for(i=1;i<=pmed; i++) {st[i]=2; med[i]=i;}
do {
for (i=1;i<=n; i++) if (st[i]==1) st[i]=0;
76 | P a g e

// reinitializare stare varfuri


for (i=1;i<=n;i++)
if (st[i]==0)
{delta=0; sumtot=calcmed();
for (j=1;j<=pmed; j++)
{ tmp=med[j]; med[j]=i;
st[i]=2; st[tmp]=0; // i se introduce in poz j
medcurent=calcmed();
if (delta<sumtot - medcurent)
{delta=sumtot-medcurent; sw1=j;sw2=i;}
// micsorare indice de transmtere
med[j]=tmp; st[tmp]=2; // restabilire j
}
if (delta>0 ) // a fost detectata o mbuntire
{ tmp=med[sw1]; med[sw1]=sw2;
st[tmp]=1; st[sw2]=2;}
// inlocuire
else st[i]=1;
}
} while (delta>0);
tipar(); printf(" %d ", calcmed());
return 0; }

77 | P a g e

Exerciii:

Des 7.2

1. Determinai medianele pentru grafurile din imaginile 7.2 A, 7.2


B.
2. Elaborai

un

program

pentru

determinarea

medianelor

interioare i exterioare ale unui graf G (V , E ),

V 200

3. Determinai 2-medianele pentru grafurile din imaginile 7.2 A,


7.2 B.
4. Elaborai un program pentru determinarea exact a 2medianelor
interioare
i
exterioare
ale
unui
graf

G (V , E ),

V 20

5. Elaborai un program pentru determinarea exact a pmedianelor ale unui graf G (V , E ),

V 20

6. Elaborai un program pentru determinarea aproximativ,


folosind algoritmul euristic ( 1) a p-medianelor ale unui graf

G (V , E ),

V 100

7. Elaborai un program pentru determinarea aproximativ,


folosind algoritmul euristic ( 2) a p-medianelor ale unui graf

G (V , E ),

V 100

8. Demonstrai Teorema 2.
78 | P a g e

Capitolul 8. Arbori
n acest capitol:

Definiii ale arborilor


Generarea tuturor arborilor pariali ai unui graf
Arbori pariali de cost minim
Algoritmul Kruskal pentru determinarea arborelui de cost minim.
Algoritmul Prim pentru determinarea arborelui de cost minim

8.1 Arbori de acoperire


Carcase
Un graf neorientat
este numit arbore dac este
conex i nu conine cicluri.
G (V , E )
Pentru graful
fiecare

G* (V , T ) T E

2
1

este

care apar n G * sunt numite

arbore

numit carcas sau arbore


parial
de
acoperire
a
grafului G. Muchiile din G,

2
1

4
3

ramuri, cele din E / T - corzi.


Des. 8.1. Graful (stnga sus) i cteva dintre
Numrul carcaselor unui carcasele sale
graf este determinat de
structura acestuia.
Algoritmii de parcurgere a unui graf conex permit i construirea
concomitent a unei carcase. ntr-adevr, proprietatea de conexitate
asigur atingerea fiecrui nod u a grafului pe parcursul lucrului
algoritmului. Pentru nodul u, atins din v, algoritmii de parcurgere nu
79 | P a g e

mai permit atingerea repetat din alt nod. Prin urmare, apariia
ciclurilor n procesul parcurgerii este imposibil.
Urmtoarea modificare a funciei DFS afieaz lista muchiilor
pentru carcasa ce corespunde parcurgerii n adncime a grafului:
int DFS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if(a[s][i] !=0 && b[i]==0)
{printf("\n %d - %d", s, i); DFS(i);}
return 0;
}

Generarea tuturor carcaselor unui graf


Mai multe probleme impun necesitatea de a genera nu o carcas
a grafului dat, ci toate carcasele posibile. De exemplu, trebuie s fie
selectat cea mai bun carcas dup un criteriu complex, care nu
permite aplicarea unor optimizri directe. n alte situaii, generarea
tuturor subarborilor n calitate de subproblem permite reducerea
complexitii la rezolvarea unor probleme de calcul economic.
Numrul posibil de carcase ale unui graf variaz n dependen
de numrul de muchii n graful iniial dar i de structura conexiunilor.
Pentru un graf complet cu n vrfuri, de exemplu, numrul calculat al
carcaselor este egal cu n n 2 . Prin urmare, problema generrii tuturor
carcaselor este una de complexitate exponenial (n caz general) .
Respectiv, algoritmul pentru generarea acestora va avea la origine
tehnica relurii. O posibil structur a algoritmului a fost dat de
Kristofides. Totui, algoritmul propus n [6, p.154] este unul iterativ,
ceea ce face mai complicat implementarea lui. n cele ce urmeaz se
propune un algoritm recursiv, care formeaz carcasele n baza listei de
muchii a grafului G.
Preprocesare: fie G (V , E ) . Se formeaz lista de muchii e1 , e2 ,..., em
grafului G.
80 | P a g e

Funcia recursiv CARCASE(k,c)


Pas A.
(i)

ik.
Muchia curent ei (v, v) . Pe graful T se lanseaz funcia

(ii)

de cutare n adncime modificat DFS (v, v) , pentru a


determina existena unei ci ntre v i v .
Dac funcia returneaz 1 (n T exist o cale ntre v i v )
STOP
n caz contrar funcia returneaz 0 (nu exist o cale
ntre v i v )

(iii)

T T

ei , c c 1

Dac c n 1 se afieaz carcasa construit T. apoi se


trece la pas 4.
n caz contrar pentru toi i de la k 1 la m CARCASE(i,c)
Pas B.
Excludere muchie T T ei c c 1
Sfrit funcie carcase.
n

funcie

se

genereaz

toate

carcasele,

care

ncep

de

la muchia ek

Algoritm
Pas 1.

k 0

Pas 2

Indicele muchiei de la care continu construcia carcasei


k k 1 .
Se formeaz un graf T din vrfurile izolate ale lui G: T (V , )
Numrul

de

muchii

carcas

c0

Pas 3. CARCASE(k,0)
Pas 4

dac k m n 1 se revine la pasul 2, altfel STOP toate


carcasele au fost generate
81 | P a g e

Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v;
Output: Arborii pariali a grafului G , generai consecutiv n tabloul
arb.
int tipar()
{ .. //afieaz soluia curent matricea de adiacen a
arborelui parial}
int scoatemuchie(int ind)
{ // exclude muchia cu
construcie}
int punemuchie(int ind)
{ // include muchia
construcie}

cu

indicele

indicele

ind

ind

din

arborele

arborele

int DFS (int s,int tt)


{ // verific prezena unui drum ntre vrfurile s i tt}
int ciclu(int im)
{ // verific apariia unui ciclu la adugarea muchiei cu
indicele im }
int back(int indicemuchie, int numarmuchii)
{ int i;
if (ciclu(indicemuchie)) return 0;
else
{ punemuchie(indicemuchie);// se adaug muchia
numarmuchii++;
if (numarmuchii==n-1) // e detectat o soluie
{tipar(); scoatemuchie(indicemuchie); numarmuchii--;
return 0;}
else
{for (i=indicemuchie+1;i<=k;i++) back(i,numarmuchii);
// se adaug urmtoarele muchii
scoatemuchie(indicemuchie);numarmuchii--; return 0;
// se exclude muchia la pasul de ntoarcere
}
}
}
int main()
82 | P a g e

{ // citire date
// formarea lista muchii
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++)
if (a[i][j]==1) {k++; ed[k].vi=i; ed[k].vj=j;}
// cutare carcase
for (i=1;i<=k-n+1;i++)
back(i,0);
return 0; }

8.2 Arbori de acoperire de cost minim


Mai multe dintre problemele formulate pe grafuri presupun
existena unei caracteristici suplimentare, atribuite muchiilor grafului
ponderea. Pentru muchia (v, u ) ponderea se noteaz cv ,u . De obicei
ponderea are o expresie numeric, care indic distana dintre noduri,
capacitatea sau timpul de transfer de-a lungul muchiei etc.
Pentru stocarea ponderilor muchiilor nu sunt necesare
modificri eseniale n structurile de date utilizate pentru descrierea
grafurilor: n matricele de inciden sau adiacen valorile unitare ce
corespund muchiilor sunt nlocuite
9
4
2
prin valorile ponderilor (desenul
8
3
5
10
6
8.2); n listele de muchii i de
8
15
10
7
1
5
inciden fiecare pereche (element)
6
6
5
este suplinit de o component ce
20
4
conine valoarea ponderii.
Prin cost al arborelui
0 0 10 6 0 0 15 0

G* (V , T ) se
ponderilor
formeaz.

va

nelege

muchiilor,

S (G )
*

( v ,u )T

suma

care

cv ,u

Pentru
grafurile
neponderate
toi
arborii
de
acoperire au acelai cost. n cazul
prezenei ponderilor n graf apare

10

6
0

0
15

0 0

0 8

0 20 5

0 20

0 0

0 0

0 10 0

6 0

5 9
0 0

0 0
10 6

0 0
0 0

0 0

Des. 8.2. Graf ponderat i matricea lui


de adiacen

83 | P a g e

i problema selectrii unui arbore de acoperire de cost minim. Exist


mai muli algoritmi eficieni pentru determi-narea arborelui de
acoperire de cost minim, cei mai cunoscui fiind:

Algoritmul Kruskal
Fie G (V , E ) un graf ponderat cu n vrfuri. Algoritmul Kruskal
folosete tehnica greedy i presupune crearea unui graf G* (V , T ) , n
care iniial T . Ulterior, muchiile din G se sorteaz dup creterea
ponderilor. La urmtoarea etap se efectueaz adugarea consecutiv
n G * a muchiilor din irul sortat, cu condiia c la adugarea muchiei
n G * nu se formeaz un ciclu. Lucrul algoritmului se sfrete cnd
numrul de muchii adugate devine n-1.
Pseudocod:
Pas 1. Se construiete G* (V , T ) , T .
Pas 2. Muchiile din G (V , E ) se sorteaz n ordinea creterii
ponderilor. Se obine irul m1 ,..., m E
Pas 3.

k 0, i 1

Pas 4. While k V 1 do
a) if T mi nu formeaz un ciclu n G * , then

T T mi , k
b)

Implementare:
Input: Graful G : matricea de adiacen a; liata de muchii v; arborele
parial de cost minim arb, tabloul componentelor conexe c.
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
84 | P a g e

int readdata()
{ // functa de citire a datelor initiale }
int printv()
{ // functia de tipar a rezultatelor}
int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=i; // initializare componente conexe
i=0;
while(k<n-1)
{ i++;
if (c[v[i].vi] != c[v[i].vj])
// verificare posibilitate adaugare muchie
{k++; arb[k]=v[i];
for(j=1;j<=n;j++)
if (c[j] == c[v[i].vj] ) c[j]=c[v[i].vi];
}
}
printv(); // afisare rezultate
return 0;
}

Algoritmul Prim
Spre deosebire de algoritmul Kruskal algoritmul Prim genereaz
arborele parial de cost minim prin extinderea unui singur subgraf Ts ,
care iniial este format dintr-un vrf. Subarborele Ts se extinde prin
adugarea consecutiv a muchiilor (vi , v j ) , astfel nct vi Ts , v j Ts ) ,
iar ponderea muchiei adugate s fie minim posibil. Procesul continu
pn la obinerea unui numr de n 1 muchii n Ts .

85 | P a g e

Pseudocod
Pas 1.

Se construiete G* (V , T ) , T .

Pas 2.

Muchiile din G (V , E ) se sorteaz n ordinea creterii


ponderilor. Se obine irul m1 ,..., m E . Toate muchiile se

Pas 3.

consider nefolosite.
k 0

Pas 4.

Ct timp k V 1 :
a)
b)

i 1
Dac muchia mi (v, v) este nefolosit i

v Ts & v Ts ) sau v Ts & v Ts ) , atunci mi se


adaug la Ts , mi se consider folosit i k , dup care
se revine la nceputul pasului 4. n caz contrar i i se
repet pas 4.b.

Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v; arborele
parial de cost minim arb, tabloul c de stare a nodurilor (se folosete
pentru a modela starea muchiilor).
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
int readdata()
{ // functa de citire a datelor initiale }
int printv()
{ // functia de tipar a reyultatelor}
int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
86 | P a g e

{ int j,i;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=0;
c[v[1].vi]=c[v[1].vj]=1; k=1;
arb[1]=v[1];
while(k<n-1) // cat arboreal nu e construit
{ i=1;
while (c[v[i].vi]+ c[v[i].vj] != 1 ) i++;
// se gaseste cea mai scurta muchie care poate fi adaugata
k++; arb[k]=v[i]; // se adauga muchia
c[v[i].vj]=c[v[i].vi]=1; // se modifica starea nodurilor
muchiei adaugate
}
printv();
return 0;
}

87 | P a g e

Exerciii

Des. 8.3

1. Determinai arborii pariali de cost minim pentru grafurile din


imaginile 8.3 A, 8.3 B.
2. Elaborai un program pentru determinarea tuturor carcaselor
unui graf G (V , E ),

V 20

3. Elaborai un program pentru determinarea arborelui parial de


cost minim a unui graf G (V , E ),

V 20 . (folosii algoritmul

Kruskal).
4. Elaborai un program pentru determinarea arborelui parial de
cost minim a unui graf G (V , E ),

V 20 . (folosii algoritmul

Prim).
5. Estimai complexitatea temporal a algoritmului Kruskal.
6. Estimai complexitatea temporal a algoritmului Prim.
7. Estimai complexitatea temporal a algoritmului de generare a
tuturor carcaselor unui graf G (V , E ) .

88 | P a g e

Capitolul 9. Cicluri
n acest capitol:

Numrul ciclomatic al grafului


Mulimea fundamental de cicluri
Determinarea mulimii fundamentale de cicluri
Tieturi n graf
Problema Euler
Ciclul eulerian
Teorema de existen a ciclului (lanului) eulerian
Algoritmi pentru construirea ciclului (lanului) eulerian

9.1 Numrul ciclomatic i mulimea fundamental de cicluri


Fie dat graful G (V , E ) cu n vrfuri, m muchii i p componente
conexe.
Valoarea (G) n p stabilete numrul total de muchii, n
fiecare din arborii pariali ai grafului G pe toate componentele de
conexitate ale acestuia. n particular, dac graful este conex, numrul
de muchii n oricare arbore parial va fi egal cu n 1 .
Valoarea

v(G) m n p m (G) se

numete

numrul

ciclomatic al grafului G. Valoarea (G) se numete numr cociclomatic.


Caracteristica ciclomatic a grafului stabilete numrul maximal de
cicluri independente8, care pot fi construite concomitent pe graf.
Astfel, dac se construiete un arbore parial T al grafului, apoi
se formeaz cicluri prin adugarea a cte o muchie a grafului, care nu
aparine arborelui T, n final se va obine o mulime de cicluri

C1 , C2 ,..., Cv (G ) , independente ntre ele.

De remarcat c ciclul Ci se

Cicluri independente dac conin cel puin cte o muchie, care aparine
doar unuia din ele
89 | P a g e
8

formeaz prin adugarea unei muchii (v j , vk ) la lanul care unete


vrfurile v j , vk n arborele T.
Fie dat un arbore parial T. Mulimea de cicluri ale grafului G,
fiecare dintre care este format prin adugarea la T a unei muchii din
G / T formeaz mulimea ciclurilor fundamentale, asociate arborelui T.
Oricare dou dintre ciclurile fundamentale sunt independente ntre ele
i orice alt ciclu, care nu face parte din mulimea ciclurilor
fundamentale poate fi reprezentat ca o combinaie liniar a acestora.
Exemplu. Fie dat graful G (V , E ) i unul din arborii lui
pariali T. (desenul 9.1).

a
b
c
Desenul 9.1 Graful G (a), un arbore parial T (b), ciclurile fundamentale (c)

Pentru

graful

G : n 6, m 9, p 1 .

Numrul

ciclomatic

v(G) 9 6 1 4 . Ciclurile fundamentale sunt: C1 , C2 , C3 , C4


De menionat c ciclurile fundamentale se
dependen de arborele parial construit (desenul 9.2)

modific

Desenul 9.2 modificarea mulimii de cicluri fundamentale a grafului din exemplul


precedent la selecia unui alt arbore parial.

90 | P a g e

9.2 Tieturi
Def.

Dac vrfurile unui graf neorientat G (V , E ) sunt separate n


dou mulimi V0 i V 0 ( V0 V , V 0 V / V0 ), atunci mulimea de
muchii, cu proprietatea c o extremitate aparine V0 i cealalt
aparine

V0

se

numete

C (V0 ) v, v :" v V0 , v V 0

tietur

C V0

grafului

Arborele parial Gp (V , E / C (V0 )) va fi format din cel puin dou


componente conexe.
Exemplu: dac din graful cercetat n exemplul precedent vor fi excluse
muchiile (2,3) (3,4) (3,5) se vor obine dou componente conexe, generate
de mulimile de vrfuri {1,2,4,5} i {3,6}. Excluderea muchiilor (1,2) (1,5)
(2,4) (3,4) (2,3) (3,5) va genera trei componente conexe {1,4} {2,5} {3,6}
(figura 9.3).

a
Des. 9.3 . Tieturi n graf.

Fie S o mulime de muchii din G , lichidarea crora genereaz


un subgraf bazic Gp (V , E S ) neconvex.

91 | P a g e

Def.

Mulimea S se numete o tietur regulat a grafului G dac


nu exist nici o submulime S S astfel nct Gp (V , E S )

s fie de asemenea neconvex.


Este evident c o tietur regulat divizeaz graful n exact dou
componente convexe, una dintre care are n calitate de vrfuri
elementele mulimii V0 i cealalt elementele mulimii V 0 .
n exemplul precedent, tietura determinat de muchiile (2,3)
(3,4) (3,5) n figura 9.3 (b) este o tietur regulat, iar cea determinat
de muchiile (1,2) (1,5) (2,4) (3,4) (2,3) (3,5) nu.
Pe un graf orientat tietura este definit n mod similar:
Def.

Dac vrfurile unui graf orientat G (V , E ) sunt separate n


dou mulimi V0 i V 0 ( V0 V , V 0 V / V0 ), atunci mulimea de
arce (u, v) , cu proprietatea c u V0 i v V 0 sau v V0 i

u V 0 se numete tietur C V0 a grafului G

C (V0 ) u, v : u V0 , v V 0

u, v : u V , v V
0

La fel ca i pentru cicluri, pentru tieturi se definete mulimea


fundamental asociat unui arbore parial T.
Tieturi fundamentale, asociate arborelui parial T se va numi o
mulime din n 1 tieturi, fiecare coninnd exact o muchie distinct a
arborelui T.
Urmtoarea teorem stabilete legtura ntre mulimea
fundamental de cicluri i mulimea fundamental de tieturi asociate
unui arbore T.
Teorem. Dac T este un arbore parial al grafului c atunci tietura
fundamental determinat de muchia ei din T este format din muchia

ei i din acele muchii ale grafului G, care nu aparin T, dar prin


adugare la T genereaz cicluri fundamentale, care conin ei .
92 | P a g e

9.3 Cicluri Euler


Problema podurilor din Knigsberg
Oraul german Konigsberg (acum Kaliningrad) este traversat de
rul Pregel. Zonele oraului, situate pe ambele maluri ale rului dar i
pe dou insule erau unite prin apte poduri, dup schema din desenul
9.4. n anul 1736 locuitorii oraului i-au trimis celebrului matematician
Euler o scrisoare, rugndu-l s rezolve urmtoarea problem: poate fi
gsit un traseu, care pornind dintr-un punct dat, s parcurg toate cele
apte poduri cte o singur dat i s revin n punctul de pornire?

Des. 9.4 Schema amplasrii podurilor n Konigsberg i graful asociat.

Euler a demonstrat imposibilitatea existenei unui asemenea


traseu, iar demonstraia a pus nceputul teoriei grafurilor.

Cicluri Euler
Def.

Fie G (V , E ) un graf neorientat. Ciclu eulerian se numete


ciclul care trece pe fiecare muchie a grafului G o singur dat.
Lan eulerian se numete lanul, care trece exact cte o dat pe
fiecare muchie a grafului.

93 | P a g e

Des. 9.5 Graf fr ciclu i lan eulerian (a), cu ciclu eulerian (b), cu lan eulerian (c).

n procesul cercetrii problemei despre podurile din Konigsberg a


fost formulat urmtoarea teorem:
Teorema 1. Un graf conex, neorientat G conine un ciclu (lan) eulerian
atunci i numai atunci cnd numrul vrfurilor de grad impar este 0 (0
sau 2 pentru lan).
( ciclu)
Necesitate. Orice ciclu eulerian intr n vrf pe o muchie i prsete
vrful pe alta. Rezult c puterea tuturor vrfurilor trebuie s fie par,
dac graful G conine un ciclu eulerian.
Suficien. Fie G un graf conex neorientat, toate vrfurile lui avnd
puteri pare. Demonstraia va fi realizat prin construcie. Ciclul ncepe
din un vrf arbitrar v0 i continu pe muchii neparcurse, consecutive,
pn la revenirea n vrful iniial. Dac au fost folosite toate muchiile
STOP ciclul eulerian cutat a fost construit. n caz contrar - fie F
ciclul recent construit (dup construcia lui au rmas muchii nefolosite).
G este conex, prin urmare, F trece prin un vrf vi , care aparine unei
muchii neincluse n F. Dac din G va fi exclus ciclul F, puterile tuturor
vrfurilor vor rmne pare. ncepnd cu vi se construiete un alt ciclu

F , pe muchiile rmase n G. Dac la construcia ciclului F au fost


consumate toate muchiile din G, procesul se oprete. Ciclul eulerian
ncepe n v0 , continu pe F pn la vi , urmeaz integral F , revine n

vi i continu pe F pn la v0 . Dac ns au mai rmas vrfuri


94 | P a g e

nefolosite n G, se consider F F F , apoi se identific un vrf v j ,


care aparine ciclului F , dar i unei muchii, care rmne n G dup
excluderea F. Urmeaz identificarea unui alt ciclu F , care ncepe n

v j i parcurge doar muchii nc neutilizate. Procesul se repet pn la


epuizarea setului de muchii din G, ceea ce echivaleaz cu construcia
unui ciclu eulerian.

Teorema 2. Un graf conex, orientat G conine un ciclu (lan cu


nceputul n p i sfritul n q) eulerian atunci i numai atunci cnd:
(i)

vi V , (vi ) (vi ) - pentru ciclul eulerian

(ii)

vi V , vi p, q (vi ) (vi ) ; ( p) ( p) 1; (q) (q) 1


- pentru lanul eulerian.

9.4 Algoritmul de construcie a ciclului eulerian


Input. Graful G (V , E ) dat prin matricea de adiacen a.
Output: Lista ordonat de parcurgere a vrfurilor L pentru obinerea
lanului eulerian

L
Pas 1. Este selectat un vrf arbitrar v0 . L v0 . vrful curent v v0 .
Pas 0.

Pas 2. Din vrful v se parcurge o muchie, care nu divizeaz graful n


componente conexe separate. Fie aceasta (v, v) . Muchia (v, v)
se exclude din G. L v v v
Pas 3. Ct timp n G mai exist muchii se revine la pasul 2.
Pas 4. Se afieaz lista L.

95 | P a g e

Implementare (cazul lanului Euler)


Input. Graful G (V , E ) dat prin matricea de adiacen a.
Output: Lista ordonat de parcurgere a vrfurilor S pentru obinerea
lanului eulerian
Structuri de date auxiliare: transa - matricea de adiacen a grafului
curent lant - ciclul de cretere curent, d marcajele vrfurilor la
crearea ciiclului
int readdata()
{ // subprogramul de citire a datelor initiale din fisier }
int print( int m)
{ // subprogramul de afisare a lantului curent }
int verif()
// subprogramul de verificare dac graful este unul eulerian
// se stabilesc i vrfurile ntre care se va construi lanul
{ int i,j, k;
for (i=1;i<=n;i++)
{
k=0;
for (j=1;j<=n; j++)
if (a[i][j] !=0 ) k++;
if (k%2==1 && s1==0) s1=i; else
if (k%2==1 && s1 !=0 && t==0) t=i; else
if (k%2==1 && s1 !=0 && t!=0) return 0;
}
if (s1==0 && t==0 ) {s1=1; t=2; return 1;}
if (s1 != 0 && t==0 ) {return 0;}
return 1;
}
int lan () // subprogramul de construcie a primului lan
{ int i, x;
for (i=1;i<=n;i++) d[i].st=0;
d[s1].st=1; x=s1;
do
{ for(i=1;i<=n;i++)
if(a[x][i] !=0 && d[i].st==0)
{
d[i].st=1; d[i].sursa=x;}
96 | P a g e

d[x].st=2;
k=1; while (d[k].st !=1) k++;
x=k;
} while (x!=t);
l=1; k=1;
s[l]=lant[k]=t;
while (x !=s1)
{
x=d[x].sursa;
l++; k++;
s[l]=lant[k]=x;
}
return 1;
}
int grad(int x)
// subprogram pentru determinarea gradului vrfului n graf
{ int s=0,i;
for (i=1;i<=n; i++)
if (transa[x][i]!=0) s++;
return s;
}
int exclude_cic()
// subprogram pentru excluderea ciclului curent din graf
{ int i;
transa[s[1]][s[l]]=transa[s[l]][s[1]]=0;
for (i=1;i<l;i++)
transa[s[i]][s[i+1]]= transa[s[i+1]][s[i]]=0;
return 1;
}
int exist()
// verificare a existenei vrfurilor pentru adugare
{ int i;
for (i=1;i<=n;i++) if (grad(i)>0) return i;
return 0;
}
int insert(int x) // subprogram pentru inserarea ciclului
curent n lan
{ int i,j, news[???];
for (i=1;i<=x; i++) news[i]=s[i]; i--;
for (j=1;j<=k; j++) news[i+j]=lant[j];j--;
for (i=x+1;i<=l;i++) news[i+j]=s[i];
97 | P a g e

l+=k;
for (i=1;i<=l;i++) s[i]=news[i];
return 1;
}
int primul()
// determinarea primului vrf de cretere a lanului
{ int i;
for (i=1;i<=l;i++)
if (grad(s[i])>0) {pr=i; return s[i];}
return 0;
}
int ciclu () // determinarea ciclului de cretere a lanului
{ int i, x;
s1=primul();
for (i=1;i<=n;i++) if (transa[s1][i] > 0) {t=i; break;}
for (i=1;i<=n;i++) d[i].st=0;
d[s1].st=1; x=s1;
transa[s1][t]=transa[t][s1]=0;
do
{ for(i=1;i<=n;i++)
if(transa[x][i] !=0 && d[i].st==0)
{
d[i].st=1; d[i].sursa=x;}
d[x].st=2;
k=1; while (d[k].st !=1) k++;
x=k;
} while (x!=t);
k=1; lant[k]=t;
while (x !=s1)
{
x=d[x].sursa;
k++; lant[k]=x;
}
return 1;
}
int main()
{ readdata();
if (verif()==0) {printf ("/n Graful nu este eulerian /n ");
return 0;}
lan();
do {
exclude_cic();
if (exist()!=0)
98 | P a g e

ciclu();
insert(pr);
print(l);

}
} while (exist()>0);
return 0;
}

Des. 9.6 Ilustrarea rezultatelor generate de program. Lanul iniial 6-3 (a). Cicluri
de cretere 6-4-3-5-6 (b), 6-7-8-6 (c), 7-1-4-7 (d), 1-2-3-1 (e).

99 | P a g e

Exerciii
1. Elaborai un program pentru determinarea mulimii
fundamentale de cicluri n baza unei tuturor carcase a unui graf

G (V , E ),

V 20

2. Elaborai un program pentru verificarea prezenei unui ciclu


Euler ntr-un graf G (V , E ),

V 20

3. Elaborai un program pentru verificarea prezenei unui lan


Euler ntr-un graf G (V , E ),

100 | P a g e

V 20

Capitolul 10. Cicluri hamiltoniene


n acest capitol:

Ciclul i lanul hamiltonian


Algoritmi exaci pentru determinarea ciclului (lanului) hamiltonian
Complexitatea algoritmilor pentru determinarea ciclului hamiltonian
Problema comisului voiajor

10.1 Cicluri i lanuri hamiltoniene


Mai multe procese industriale presupun prelucrarea
unui
numr de produse cu ajutorul unei singure instalaii. Timpul total i
cheltuielile depind doar de numrul operaiilor de calibrare (ajustare,
curare etc.) a instalaiei ntre prelucrarea a oricare dou produse

pi , p j . Mai mult, exist perechi de produse, prelucrarea consecutiv a


crora permite funcionarea continu a instalaiei, fr calibrare. Prin
urmare att timpul total de prelucrare, ct i cheltuielile pot fi
minimizate prin selectarea unei consecutiviti de prelucrare a
produselor care va necesita un numr minim (sau nul) de operaii de
calibrare.
Dac produsele prelucrate p1 , p2 ,..., pn formeaz vrfurile unui
graf, iar perechile de produse compatibile ( pi , p j ) - muchiile lui,
atunci determinarea unui ciclu care trece exact cte o singur dat prin
fiecare vrf al grafului este echivalent cu determinarea unei
consecutiviti de prelucrare a produselor care nu necesit nici o
operaie de calibrare. Problema rmne aceeai, indiferent de faptul
dac graful este unul orientat sau nu.
Ciclul, care trece exact cte o dat prin fiecare vrf al grafului se
numete ciclu hamiltonian.

101 | P a g e

Exist cteva formulri ale problemei, n dependen de tipurile


de grafuri i restricii. n continuare vor fi cercetate dou probleme
distincte:
a. Este dat un graf (ne)orientat . Se cere s se determine unul
sau toate ciclurile hamiltoniene, dac acestea exist
b. Este dat un graf complet cu muchii ponderate (ponderea
muchiei

i, j

ci , j ). Se cere s se determine un ciclu

(lan) hamiltonian de cost minim.


Spre deosebire de cazul ciclului eulerian, pentru ciclul
hamiltonian nu exist un criteriu exact de determinare a existenei
acestuia ntr-un graf arbitrar. Totui, exist cteva teoreme, care pot
stabili prezena ciclului hamiltonian n anumite grafuri:
Teorema Dirac
Fie G (V , E ) un graf neorientat cu n 2 vrfuri. Dac d (v)

n
2

pentru orice vrf v din graf, atunci graful este hamiltonian.

Teorema Ore
Fie G (V , E ) un graf neorientat cu n 2 vrfuri. Dac suma gradelor
oricror

dou

vrfuri

neadiacente

din

graf

d (u) d (v) n, u, v V : (u, v) E , atunci graful este hamiltonian.

Teorema Bondy-Chvtal
Notaii: Fie G (V , E ) un graf neorientat cu n vrfuri. Se numete
nchidere a grafului G graful G , obinut prin adugarea a cte o
muchie u, v pentru fiecare pereche de vrfuri u, v neadiacente n G ,
cu proprietatea c d (u) d (v) n . nchiderea grafului G se noteaz i

cl (G) .
102 | P a g e

Teorema
Fie G (V , E ) un graf neorientat. G este hamiltonian dac i
numai dac cl (G) este un graf hamiltonian

10.2 Algoritmul pentru determinarea ciclurilor (lanurilor)


hamiltoniene
Pentru problema determinrii ciclurilor (lanurilor) hamiltoniene
nu exist algoritmi eficieni de complexitate polinomial. Problema este
una din clasa NP [11, p. 378]. Prin urmare, o abordare admisibil
devine un algoritm recursiv, bazat pe tehnica relurii. Iniial,
algoritmul propus de Roberts i Flores [6, p. 249] presupunea abordarea
iterativ:

Pseudocod (Roberts-Flores)
Pas 1. Se formeaz tabloul M [mi , j ] de dimensiuni

k n ,

n care

elementul mi , j este cel de al i ulea vrf (fie vq ), pentru care n

G (V , E ) exist arcul v j , vq . Numrul de linii n matrice va


fi determinat de cel mai mare semigrad de ieire a vrfurilor
din G . S mulimea vrfurilor incluse n soluie, n ordinea
parcurgerii lor. S .
Pas 2. Se alege un vrf arbitrar (fie vi ), de la care ncepe construcia
ciclului (lanului). Se include n S S

vi

v vi .

Pas 3. Se alege primul vrf nefolosit din coloana v . Fie acesta v j Se


ncearc adugarea acestuia la S . Exist dou cazuri, cnd un
vrf nu poate fi adugat la mul-imea S :
a. n coloana v nu exist vrfuri nefolosite
b. Numrul de elemente n S este n . Secvena de vrfuri din S
formeaz un lan hamiltonian. n acest caz, dac exist un arc
103 | P a g e

(muchie) de la ultimul element din S la primul a fost


identificat un ciclu hamiltonian. n caz contrar exist doar
lanul hamiltonian.
n cazurile (a),(b) se trece la pasul 5, altfel S S

v j i v v j

Pas 4. Se repet pasul 3 pn la apariia uneia din situaiile descrise


n 3(a) sau 3(b)
Pas 5. Fie S (v1 , v2 , vk 1 , vk ) . S S vk . Dac S , v vk 1
apoi se trece la pasul 3, altfel STOP toate secvenele posibile
au fost cercetate.

Implementare (recursiv)
Urmtorul
program
permite
determinarea
lanurilor
hamiltoniene. Matricea de adiacen este stocat n tabloul a, soluiile
se formeaz n tabloul s. Programul permite urmrirea dinamicii
construciei lanurilor hamiltoniene. Tehnica de implementare
reluare.
#include <conio.h>
#include <stdio.h>
int a[30][30], m[30][30], s[30], n,i,j,k,ne;
FILE *f;
int readdata()
{ int i,j;
f=fopen("dataham.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
fscanf(f, "%d", &a[i][j] );
fclose(f);
return 0;
}
int make_m()
{ int i,j,k;
for (i=1;i<=n;i++)
{ k=0;
for (j=1;j<=n;j++)
if ( a[i][j] != 0)
104 | P a g e

{ k++;
m[k][i]=j;
}
}
}
int print_s(int q)
{ int i;
printf("\n");
for (i=1; i<=q; i++) printf("%d ", s[i]);
getch();
return 0;
}
int exist (int a,int pos)
{ int i,k=0;
for (i=1;i<=pos;i++)
if (s[i] == a) k=1;
return k;
}
int hamilton(int element, int index)
{ int i,j;
if (exist (element, index-1)) return 0;
s[index]=element;
if (index==n) { printf("\n solutie "); print_s(index);
index--; return 0;}
else { index++;
j=1;
do
{ hamilton(m[j][element], index); j++; }
while (m[j][element] !=0);
index--;
}
return 0;
}
int main()
{ readdata();
make_m();
hamilton(1,1);
return 0;
}

105 | P a g e

Exemplu

Matricea M pentru graful din imagine


este

10.3 Problema comisului voiajor


Problema determinrii ciclului (lanului) hamiltonian de cost
minim pe un graf complet, ponderat, mai este cunoscut i ca problema
comisului voiajor.
O abordare direct a problemei comisului voiajor prin construcia
arborelui de soluii i selectarea celui mai puin costisitor ciclu
hamiltonian este evident. Totui, se observ o legtur ntre problema
comisului voiajor i problema arborelui parial de cost minim, cercetat
anterior. Dac arborele de cost minim formeaz un lan, atunci aceasta
este i un lan hamiltonian, iar dac suplimentar, n graful iniial mai
exist i muchia care unete vrfurile terminale ale lanului acesta se
transform n ciclu hamiltonian. Prin urmare, pentru a rezolva
problema comisului voiajor este suficient s se determine arborele
parial de cost minim cu proprietatea c n 2 vrfuri ale arborelui au
gradul doi, iar dou gradul 1.
Se va ncerca abordarea euristic a rezolvrii problemei
comisului voiajor
Exist dou probleme pentru detrminarea celui mai scurt lan
hamiltonian, formulate separat:
106 | P a g e

Problema (a) Cel mai scurt lan hamiltonian. S se determine o


carcas T (V , ET ) a grafului K n

astfel nct gradele tuturor

vrfurilor din T s nu depeasc 2.


Problema (b) Cel mai scurt lan hamiltonian cu vrfuri
terminale fixe. Fiind date dou vrfuri v1 i v2 ale grafului K n
s se determine o carcas T (V , ET ) a grafului
gradele vrfurilor v1 i

astfel nct

v2 n T s fie 1, iar gradele tuturor

celorlalte vrfuri din T - 2.


Teorema 1 Fie C [ci , j ] matricea costurilor grafului iniial K n i w o valoare suficient de mare (care depete lungimea oricrui lan
hamiltonian). Atunci rezolvarea problemei (a) cu matricea costurilor

C [ci, j ] unde
cj ,1 c j ,1 w
c1, j c1, j w
v v1 , v2
c2, j c2, j w j
cj ,2 c j ,2 w
ci, j ci , j 2w vi , v j v1 , v2
ci, j ci , j

vi , v j v1 , v2

este n acelai timp i rezolvarea problemei (b) pentru matricea iniial


a costurilor pentru vrfurile terminale v1 i v2 .

Teorema 2 Dac matricea costurilor C [ci , j ] unui graf se transform


n matricea C [ci, j ] astfel nct ci, j ci , j p(i) p( j ) i, j 1,..., n
unde

p(k )

este un vector de valori numerice constante, atunci

lungimile relative ale tuturor lanurilor hamiltoniene nu se modific.

107 | P a g e

Algoritmul de aplicare a amenzilor


Algoritmul presupune transformarea ponderilor muchiilor
grafului iniial astfel nct arborii pariali n form de lan s devin
prioritari n procesul de construire a arborelui de cost minim.
Va fi cercetat problema construciei lanului hamiltonian de
cost minim ntre dou vrfuri date v1 i v2 .
Fie dat graful

complet Kn (V , E ) , cu matricea costurilor

C [ci , j ] , i vrfurile v1 , v2 V ntre care urmeaz s fie construit


lanul hamiltonian de cost minim.
Pas 1. Matricea costurilor se modific conform formulelor date de
teorema menionat anterior.
Pas 2. Se determin un arbore parial de cost minim T (V , ET ) . Dac
acesta este un lan hamiltonian STOP - problema a fost
rezolvat. n caz contrar se trece la pasul 3
Pas 3. Tuturor vrfurilor vi din T cu grade ce depesc 2 li se aplic
amenzi, conform formulei: p vi z (dvTi 2) .
Pas 4. Se

recalculeaz

matricea

costurilor

conform

formulei:

ci, j ci , j p(i) p( j ) i, j 1,..., n , apoi se revine la pasul 2.


Fiind un algoritm euristic, soluia obinut nu ntotdeauna este
una optim.

108 | P a g e

Exerciii
1. Elaborai un program pentru determinarea ciclului hamiltonian
(sau a lipsei acestuia) ntr-un graf G (V , E ),

V 20

2. Elaborai un program pentru rezolvarea problemei comisului


voiajor pe un graf complet

K N , N 20 . (folosii tehnica

relurii)
3. Elaborai un program pentru rezolvarea problemei comisului
voiajor pe un graf complet K N ,

N 20 . (folosii algoritmul de

aplicare a amenzilor)

109 | P a g e

Capitolul 11. Fluxuri n reea


n acest capitol

Noiune de reea pe graf. Elemente ale fluxului


Teorema despre tietura minim.
Algoritmul Ford-Fulkerson
Fluxul maxim pentru surse i destinaii multiple
Fluxul maxim pe grafuri bipartite
Aplicaii ale problemei de flux maxim

11.1 Preliminarii
Problema fluxului maxim, la fel
ca multe alte probleme formulate pe
grafuri, i are rdcinile n economia
modern, mai exact n optimizarea
economic. Mai recente sunt aplicaiile
n domeniul reelelor i fluxurilor
informaionale. Dac este cercetat o
Des. 11.1.
reea de transportare a unui material Reea de transport cu sursa n vrful
din un punct n care acesta este produs 1 i stocul n vrful 10.
(surs) ntr-un punct de depozitare sau
prelucrare (stoc) prin canale de transport cu anumite capaciti,
inevitabil apare problema determinrii capacitii de transportare a
materialului de la surs ctre stoc pentru toat reeaua. Materialul i
canalele de transport pot avea cea mai divers natur: produse
petroliere i conducte; piese i transportoare; pachete de date i canale
informaionale, etc.
Pe grafuri problema se formuleaz astfel: Este dat un graf
orientat G (V , E ) , cu ponderi anexate arcelor: pentru arcul (i, j )
ponderea este ci , j . Pentru dou vrfuri date s, t V se cere s se

110 | P a g e

determine fluxul maxim care poate fi deplasat din s (surs) n t


(stoc).(Des. 11.1)

11.2.Algoritm
Descriere general
Algoritmul se bazeaz pe determinarea iterativ a unor drumuri
de cretere a fluxului i acumularea acestora ntr-un flux total, pn la
apariia n reea a unei tieturi9, care separ sursa de stoc.
Se cerceteaz graful G (V , E ) cu capacitile arcurilor

ci , j ,

sursa s i stocul t ( s, t V ). Pe arcuri se definesc marcajele ei , j , care


vor indica valoarea curent a fluxului de-a lungul arcului (i, j ) . Pentru
marcajele arcurilor se va respecta urmtoarea condiie:

w vi s

ei , j ek ,i w vi t

v j ( vi )
vk 1 ( vi )
0 v s , t
i
Cu alte cuvinte: sursa s produce un flux de mrime w. Pentru
orice vrf intermediar fluxul de intrare este egal cu fluxul de ieire. n
stocul t intr un flux de mrime w.
Problema fluxului maxim se reduce la determinarea unui w:

v j ( s )

ei , s

ek ,t max

vk ( t )

Legtura ntre fluxul maxim i tietura minim n graf este dat


de urmtoarea teorem:
Teorem: ntr-un graf orientat G (V , E ) valoarea w a fluxului maxim
din s n t este egal cu mrimea tieturii minime (Vm Vm ) , care
separ s de t.

Tietur n graf un set de muchii (arcuri), lichidarea crora divide graful n dou
componente conexe.
111 | P a g e
9

Tietura (V0 V0 ) separ s de t dac s V0 , t V0 . Mrimea


tieturii este suma ponderilor arcurilor din G (V , E ) , cu nceputul n

V0 i sfritul n V0 , sau w V0 V0
Tietura

minim

(Vm Vm )

ci , j .

este

tietura

vi ,v j V0 V0

pentru

care

w Vm Vm min
c
i, j
V0 V0 vi ,v j V0 V0

Notaii:
Pentru implementarea algoritmului vor fi folosite att marcaje
pentru arcuri ct i marcaje pentru vrfurile grafului. Marcajul unui
vrf v este format din trei componente: precedent, flux, stare, care au
semnificaia:
precedent vrful care l precede pe v n drumul de cretere
curent
flux mrimea fluxului, care ajunge n vrful v pe drumul de
cretere curent
stare starea curent a vrfului v (vrful poate fi n una din trei
stri: necercetat [marcaj nul, valoarea - 0], atins[vecin al unui vrf
cercetat, valoarea - 1], cercetat[toi vecinii atini, valoarea - 2]).
Vecinii vrfului x

( x) : V V : z V , ( x, z ) E (mulimea vrfurilor
n care se poate ajunge direct din vrful x).

( x) : V V : z V , ( z, x) E (mulimea

vrfurilor

din care se poate ajunge direct n vrful x).

Pseudocod
Pas 0
Pas 1

Marcajele arcurilor se iniializeaz cu 0.


Marcajele vrfurilor se iniializeaz: precedent 0, stare 0,
flux . Marcajele muchiilor se pstreaz.

112 | P a g e

Pas 2

Iniializarea sursei s.
Marcajul sursei s : (+s, +, 1)10 Se consider vi s .

Pas 3

Cercetarea vrfului atins vi .


a. Pentru toate vrfurile necercetate v j (vi ) : ei , j ci , j se
aplic marcajul vi , ,1 , unde min(vi , ci , j ei , j ) ;
b. Pentru toate vrfurile necercetate v j (vi ) : e j ,i 0 se aplic
marcajul

vi , ,1 , unde

min(vi , e j ,i ) .

c. Vrful vi este marcat cercetat. (Componenta stare primete


valoarea 2 )
Pas 4
a. Dac vrful t este atins, se trece la pasul 5;(drumul curent de
cretere a fost construit), altfel:
b. dac exist vrfuri atinse, dar t nc nu este atins, este
selectat un vrf atins vi i se revine la pasul 3, altfel:
c. fluxul maxim a fost obinut. SFRIT11.
Pas 5 Creterea fluxului. Modificarea marcajelor pe arcuri.
a. Se consider v t ; c t
b. Dac vrful v are marcajul de forma z, ,* valoarea
fluxului de-a lungul arcului (z, v) este majorat cu c :

ez ,v ez ,v c ,
altfel, dac vrful v are marcajul de tip z, ,* valoarea
fluxului de-a lungul arcului (v, z) este micorat cu c :

ev, z ev, z c ;
c.

v z . Dac v s , se revine la pasul 5.b, altfel la pas 1.

Precedent se consider tot nodul surs s, valoarea fluxului n s se consider infinit, s se


consider atins.
11
Nu mai exist o cretere a fluxului, care ar ajunge la destinaia (stocul) t. Creterea
precedent a fluxului a determinat tietura minim, care separ s de t.
113 | P a g e
10

Exemplu
Graful 11.1. Sursa - vrful 1, stocul vrful 10.
ITERAIA 1
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
2
3
4
5
7

:
:
:
:
:
:

2-(1,30,1); 3-(1,30,1);
5-(2,30,1);
4-(3,10,1); 9(3,10,1)
7-(4,10,1);
8-(5,25,1);
10 -(7,10,1);

nod
precedent

1
1

2
1

3
1

4
3

5
2

flux
stare

30 30 10 30
2 2 2 2 2

6
0

7
4

8
5

1-(1,,2 )
2-(1,30,2)
3-(1,30,2)
4-(3,10,2)
5-(2,30,2)
7-(4,10,2)

9
3

10
7

0 10 25 10
0 2 1 1

10
1

n stoc se ajunge cu un flux de


valoare 10. Marcajele arcurilor,
care formeaz drumul de
cretere a fluxului (7,10) (4,7)
(3,4) (1,3) se modific.

ITERAIA 2
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
2
3
5
4
7

:
:
:
:
:
:

2-(1,30,1); 3-(1,20,1);
5-(2,30,1);
9(3,10,1)
4-(5,10,1); 8-(5,25,1);
7-(4,8,1);
10 -(7,8,1);
2
1

3
1

4
5

8
5

1-(1,,2 )
2-(1,30,2)
3-(1,20,2)
5-(2,30,2)
4-(5,10,2)
7-(4,8,2)

nod
precedent

1
1

5
2

6
0

7
4

9
3

10
7

flux
stare

30 20 10 30
2 2 2 2 2

0
0

8 25 10
2 1 1

8
1

n stoc se ajunge cu o cretere a


fluxului de valoare 8. Marcajele
arcurilor, care formeaz drumul
de cretere (7,10) (4,7) (5,4) (2,5)
(1,2) se modific.

ITERAIA 3
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
2
3
5
4
8

:
:
:
:
:
:

2-(1,22,1); 3-(1,20,1);
5-(2,22,1);
9(3,10,1)
4-(5,2,1); 8-(5,22,1);
6-(8,5,1);10 -(8,22,1);

nod
precedent

1
1

flux
stare

22 20
2 2 2

114 | P a g e

1-(1,,2 )
2-(1,22,2)
3-(1,20,2)
5-(2,22,2)
4-(5,2,2)
8-(5,22,2)

2
1

3
1

4
5

5
2

6
8

7
0

8
5

9
3

10
8

2 22
2 2

5
1

0 22 10
0 2 1

22
1

Creterea fluxului: 22.


Marcajele arcurilor, care
formeaz drumul de cretere
(8,10) (5,8) (2,5) (1,2) se
modific.

ITERAIA 4
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
(9,5,2)
cercetare
(4,5,2)
cercetare
4,5,2)
cercetare
(9,10,2)

1 : 3-(1,20,1);
1-(1,,2 )
3 : 9(3,10,1)
3-(1,20,2)
9 : 4-(9,5,1); 7-(9,10,1);
9-(3,10,2)
4
: 2-(4,5,1); 5-(-4,5,1)
42

2-

: 8-(5,3,1)

5-(-

: 10-(7,7,1)

7-

nod
precedent

1
1

2
4

3
1

flux
stare

5 20
2 2

4 5
9 -4

6
0

5
2

0 10
0 2

5
2

7
9

8
5

9
3

10
7

3 10
1 2

7
1

Creterea fluxului: 7. Marcajele


arcurilor, care formeaz drumul
de cretere (7,10) (9,7) (3,9) (1,3)
se modific.

ITERAIA 5
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
3
9
4
2
5
7
8

:
:
:
:
:
:
:
:

3-(1,13,1);
9(3,3,1)
4-(9,3,1); 7-(9,3,1);
2-(4,3,1); 5-(-4,3,1)
8-(5,3,1)
10-(8,3,1)

nod
precedent

1
1

2
4

3
1

flux
stare

3 13
2 2

1-(1,,2 )
3-(1,13,2)
9-(3,3,2)
4-(9,3,2)
2-(4,3,2)
5-(-4,3,2)
7-(9,3,2)
8-(5,3,2)

4 5
9 -4

6
8

7
9

8
5

9
3

10
8

3
2

3
1

3
2

3
2

3
2

3
1

3
2

Creterea fluxului: 3. Marcajele


arcurilor, care formeaz drumul
de cretere (8,10) (5,8) (5,4) (9,4)
(3,9) (1,3) se modific. Se
observ micorarea fluxului pe
arcul (5,4) cu compensarea pe
arcurile (3,9)(9,4).
Tot odat poate fi observat i
tietura, format de
flux(5,8)(7,10). Prin urmare
fluxul maxim ntre nodurile 1 i
10 are valoarea 50. Urmtoarea
iteraie nu va mai realiza o
cretere a fluxului.

115 | P a g e

Implementare algoritm
Urmtorul
fragment
de
cod
realizeaz
o
variant
demonstraional a algoritmului pentru determinarea fluxului maxim
n reea. Reeaua din N vrfuri este descris prin matricea de adiacen
A[NN], marcajele arcurilor (fluxul generat) se pstreaz n tabloul
E[NN], marcajele vrfurilor n tabloul VERT[N].
#include <conio.h>
#include <stdio.h>
int a[30][30], e[30][30],i,j,n,s,t, delta, big=0;
struct vertex{int flux; int sursa; int stare;} vert[30];
FILE *f;
int readdata()
{ int i,j;
f=fopen("flux.in", "r");
fscanf(f, "%d", &n);
fscanf(f, "%d %d", &s, &t);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{fscanf(f, "%d", &a[i][j]); big+=a[i][j];}
fclose(f);
return 0;
}
int init_vert()
{ int i;
for (i=1;i<=n;i++)
{vert[i].flux=big; vert[i].sursa=vert[i].stare=0;}
vert[s].stare=1; vert[s].sursa=+s;
return 0;
}
int activ()
{
int i;
for (i=1;i<=n;i++)
if (vert[i].stare ==1) return i;
return 0;
}
116 | P a g e

int fluxtotal()
{ int i,ft=0;
for (i=1;i<=n;i++) ft+=e[s][i];
return ft;
}
int abs(int x)
{ if (x<0) return x*-1; else return x;
}
int flux()
{ int x,i,d,q;
// miscarea inainte, constructie lant
do
{ x=activ();
//dupa G+
for (i=1;i<=n;i++)
if (vert[i].stare==0 && a[x][i]>0 && e[x][i]<a[x][i])
{ d=a[x][i]-e[x][i];
if ( d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=+x;
};
// dupa Gfor (i=1;i<=n;i++)
if (vert[i].stare==0 && e[i][x]>0)
{ d=e[i][x];
if (d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=-x;
}
vert[x].stare=2;
}
while (vert[t].stare !=1 && activ() !=0 );
// miscarea inapoi, extinderea fluxului
delta=0;
if (vert[t].stare==1 )
{ x=t;
delta=vert[t].flux;
do
{ q=abs(vert[x].sursa);
if (vert[x].sursa>0) e[q][x]=e[q][x]+delta;
if (vert[x].sursa<0) e[x][q]=e[x][q]-delta;
x=q;
117 | P a g e

}
while (x!=s);
}
int main()
{ readdata();
do
{ init_vert();
flux();
} while (delta !=0);
printf("\n%d", fluxtotal());
return 0;
}

11.3 Flux maxim cu surse i stocuri multiple


Fie dat un graf G (V , E ) cu multiple surse ( ns ) i

stocuri

( nt ). Se presupune c fluxul poate fi direcionat de la orice surs la orice


stoc. Problema determinrii unui flux de mrime maxim de la toate
sursele la toate stocurile se reduce la problema clasic a fluxului maxim
prin adugarea unei surse virtuale i a unui stoc virtual, conectate prin
arce la celelalte surse (respectiv stocuri)(desenul 11.2).

c( s, si ) c si , v j
k

j 1

c(ti , t ) c v j , ti
r

j 1

Des. 11.2 Adugarea sursei i stocului virtual

Pentru fiecare arc ( s, si ) ponderea acestuia,

c s, si c( si , v j ) se
j 1

calculeaz ca fiind suma ponderilor arcelor cu originea n si .


118 | P a g e

Pentru fiecare arc (ti , t ) ponderea acestuia,

c(ti , t ) c v j , ti se
r

j 1

calculeaz ca fiind suma ponderilor arcelor cu vrful n ti .

11.4 Flux maxim pe grafuri bipartite


Algoritmul pentru determinarea fluxului maxim poate fi utilizat
eficient i pentru rezolvarea altor probleme pe anumite clase de grafuri.
Astfel, problema cuplajului maxim pe grafuri bipartite se rezolv
eficient prin adugarea unei surse virtuale la o parte a grafului i a
unui stoc virtual la cealalt parte.

G (V , E )
V V V , V V i
bipartit:
e (u, v) E u V , v V sau v V , u V , neorientat, neponderat.
Fie

Transformare graf
Pas 1. Se adaug dou vrfuri s, t iniial izolate. V V

s, t .

Pas 2. Toate muchiile se transform n arce, orientate de la V ctre V


Pas 3.
a) Pentru fiecare vrf v V se formeaz arcul c, ponderea
cruia este cs ,v v
b) Pentru fiecare vrf u V se formeaz arcul (u, t ) , ponderea
cruia este cu ,t u
Pas 4. Pe graful astfel format se lanseaz algoritmul determinrii
fluxului maxim din s n t .
Pas 5

Rezultat:
Arcele

de

forma

e (u, v) E

u V , v V

sau

v V , u V incluse n fluxul maxim vor forma cuplajul maxim


pe muchiile grafului iniial G.

119 | P a g e

11.5 Flux maxim pe grafuri cu capaciti restricionate ale


vrfurilor i muchiilor
Mai multe probleme, rezolvarea crora implic utilizarea
algoritmilor de flux maxim conin restricii (caracteristici) asociate nu
doar arcurilor grafului ( ci , j ), dar i vrfurilor acestuia ( z j ).
Fie

graful

ci , j (i 1,..., n; j 1,..., n)

G (V , E )
i

capacitile

cu

ponderile

vrfurilor

arcelor

z j ( j 1,..., n)

Restricia impus de capacitile vrfurilor determin valoarea fluxului


total ei , j (i 1,..., n) , la intrare n vrful v j ca

e
i 1

i, j

zj

( j 1,..., n)

Pe graful G (V , E ) se cere determinarea unui flux maxim de la


vrful s la vrful t.
Rezolvarea presupune transformarea grafului iniial G (V , E ) ,
ntr-un alt graf G0 (V0 , E0 ) , care va conine doar restricii la
capacitile arcelor. Pe graful G0 (V0 , E0 ) se va aplica un algoritm
clasic pentru determinarea fluxului maxim, care va genera i soluia
problemei iniiale.
Modelul de transformare este urmtorul: fiecare vrf v j al
grafului iniial este nlocuit cu o pereche de vrfuri v j , v j i un arc

, v j

care le unete. Capacitatea arcului este egal cu capacitatea

vrfului v j : c v j , v j z j . (desen 11.3)

Des. 11.3 Transformarea vrfurilor grafului G.

Arcele

v , v
i

v , v din
i

graful iniial se transform n G0 n arce

cu aceeai capacitate. La fel se transform arcele care i au

120 | P a g e

originea n vrful v j :

v , v
j

trec n

v , v . Exemplu transformare,

desenul 11.4:

Des. 11.4 Transformarea grafului G

Dup transformrile efectuate fluxul maxim pe graful G0 va


corespunde fluxului maxim pe graful G . Este important de menionat,
c n cazul cnd tietura determinat de fluxul maxim pe G0 nu conine
nici unul din arcele formate la transformarea grafului G , restriciile de
capacitate ale vrfurilor nu sunt semnificative.

121 | P a g e

Exerciii
1. Elaborai un program pentru separarea mulimii de vrfuri a
unei reele de transport n dou componente distincte: mulimea
de surse i mulimea de stocuri.
2. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu surse i destinaii multiple.
3. Elaborai un program pentru transformarea grafului cu restricii
aplicate pe vrfuri ntr-un graf cu restricii aplicate pe muchii.
4. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu restricii aplicate pe vrfuri.

122 | P a g e

Capitolul 12. Cuplaje


n acest capitol

Noiune de cuplaj, cuplaj maxim


Grafuri asociate
Legtura ntre problema cuplajului maxim i a mulimii maximal
independente
Algoritmi pentru determinarea tuturor cuplajelor maxime
Complexitatea algoritmului pentru determinarea tuturor cuplajelor maxime

12.1 Cuplaje
ntr-un graf neorientat G (V , E ) mulimea de muchii M se
numete cuplaj dac oricare dou muchii din M nu an vrfuri comune.
Cuplajul M se numete maxim, dac e E M , n mulimea

M {e} exist muchia

e : e e v* ; v* V . La fel ca i mulimile

independente maxime, cuplajele maxime pot fi formate din mulimi cu


numr diferit de elemente (vrfuri pentru mulimile maximal
independente, muchii pentru cuplaje), desen 12.1.

Des. 12.1 Cuplaje maxime n graful (a). Cuplaj maxim pe patru muchii (1,4) (2,3)
(5,8) (6,7) (b); cuplaj maxim pe trei muchii (1,5) (2,3) (6,8) (c)

Pentru un graf arbitrar pot fi formulate mai multe probleme,


pentru rezolvarea crora este necesar determinarea unui cuplaj cu
123 | P a g e

proprieti prestabilite. De exemplu problema cuplajului maxim pe


anumite categorii de grafuri se rezolv eficient (de exemplu pe grafurile
bipartite, unde poate fi redus la problema fluxului maxim). De
asemenea este cunoscut algoritmul maghiar pentru determinarea
cuplajului maxim ntr-un graf arbitrar [6, p.396].
n continuare va fi cercetat problema general de generare a
tuturor cuplajelor unui graf neorientat arbitrar G (V , E )
Problema va fi rezolvat prin reducerea n timp ptratic la o alt
problem pe grafuri, rezolvarea creia este deja cunoscut problema
mulimii maximal independente, mai exact problema generrii tuturor
mulimilor maximal independente.

12.2 Graf asociat


Fie graful neorientat G (V , E ) E e1 ,..., eM . Se va construi
graful

GA (VA , EA ) ,

VA e1 ,..., eM

unde

iar

EA ei , e j : u V , u ei & u e j .
Exemplu: fie graful G (V , E ) din figura 12.2.a. Fiecare muchie din se
transform ntr-un vrf al grafului GA (VA , EA ) din desenul 12.2.b

a
Des. 12.2 Graful iniial (a) i asociat (b).

124 | P a g e

Oricare dou vrfuri

e , e din
i

GA (VA , EA ) sunt conectate prin

muchie, dac n graful iniial exist un vrf comun u al muchiilor ei , e j .


Teorem: fiecrui cuplaj maxim n graful G (V , E ) i corespunde o
mulime maximal independent n GA (VA , EA ) i invers: fiecrei
mulimi maximal independente n GA (VA , EA ) i corespunde un cuplaj
maxim n G (V , E ) .

Direct. Rezult direct din proprietile GA (VA , EA ) Oricare dou


muchii G (V , E ) care nu au vrf comun nu sunt adiacente n

GA (VA , EA ) . Prin urmare, muchiilor din cuplajul maxim n G (V , E )


le corespunde o mulime independent n GA (VA , EA ) . Aceasta este i
maxim independent, altfel n G (V , E ) ar exista cel puin nc o
muchie, care ar putea fi adugat n cuplaj, pstrnd proprietile
acestuia.
Invers.

Fie

M A e1A ,...eAk

mulime

maxim

independent

GA (VA , EA ) . Atunci n G (V , E ) exist cuplajul e1A ,...eAk . Dac el

nu este unul maxim, e : eA ,...eA


*

e - cuplaj. n acest caz vrfurile


*

u, v , care formeaz muchia e* , nu sunt adiacente vrfurilor din

mulimea independent M A . n consecin eA ,...eA


1

e* este o mulime

maxim independent, ceea ce contrazice presupunerile iniiale.

12.3 Funcia de generare a grafului asociat


Din cele expuse anterior rezult c problema determinrii
tuturor cuplajelor maxime pe G (V , E ) este echivalent cu problema
determinrii tuturor mulimilor maxim independente pe GA (VA , EA ) .

125 | P a g e

Pentru a rezolva problema este necesar, mai nti s se


construiasc graful asociat GA (VA , EA ) .

Algoritm:
Pas 1. Se creeaz lista muchiilor din G (V , E ) . L e1 ,...em .
Pas 2. Se creeaz tabloul bidimensional E matricea de adiacen a
grafului GA .
Pas 3. Pentru toi i de la 1 la m-1.
Pentru toi j de la i+1 la m
Dac n G (V , E ) ei

e j ; ei , e j E ,

atunci Ei, j Ej ,i 1 altfel Ei, j Ej ,i 0

Implementare
Intrare: graful G (V , E ) , descris n tabloul bidimensional a.
Ieire: matricea de adiacen a grafului GA (VA , EA ) . Matricea de
adiacen este localizat n tabloul bidimensional b.
int asociat ()
{ int i,j;
// modelare lista muchii
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
// modelare matrice adiacenta
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 ||
list[i].v1==list[j].v2 || list[i].v2==list[j].v1
|| list[i].v2==list[j].v2 ) b[i][j]=b[j][i]=1;
}

12.4 Generarea tuturor cuplajelor maxime

126 | P a g e

Problema este rezolvat direct prin aplicarea consecutiv a doi


algoritmi descrii anterior. Mai nti se formeaz graful asociat

GA (VA , EA ) , apoi pentru acesta este aplicat algoritmul de generare a


mulimilor maxim independente. La generarea fiecrei soluii vrfurile
care o formeaz n GA (VA , EA )

sunt transformate n muchiile

corespunztoare din G (V , E ) .
Exemplu: prototip program pentru generarea tuturor cuplajelor
maxime
Intrare: graful G (V , E ) .
Ieire: toate cuplajele maxime ale grafului G (V , E ) .
#include <conio.h>
#include <stdio.h>
struct edge{int v1; int v2;} list[400];
int a[20][20],b[400][400], q[20], s[20], m=0,i,j,n,k;
FILE *f;
int asociat ()
{ int i,j;
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 || list[i].v1==list[j].v2
|| list[i].v2==list[j].v1 || list[i].v2==list[j].v2
) b[i][j]=b[j][i]=1;
}
int fillc(int *x, int z, int num)
{ int i;
for (i=1;i<=num;i++) x[i]=z;
return 0;
}
int print()
{ int i;
printf("\n");
127 | P a g e

for (i=1;i<=m;i++)
if (s[i]==1) printf("(%d %d)", list[i].v1, list[i].v2);
printf("\n");
}
int mind(int *s, int *q)
{ int i,j,k=0,r, rest[20];
for (i=1;i<=m;i++) if(q[i]!=0) k=1;
if (k==0) {print();}
else { j=m;
while (s[j]==0 && j>=1) j--;
r=j+1;
for (i=r;i<=m;i++)
if (q[i]==1){ fillc(rest,0,m);
s[i]=1; q[i]=0;
for (j=1;j<=m;j++)
if (b[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
s[i]=0;q[i]=1;
for (j=1;j<=m;j++)
if(rest[j]==1) q[j]=1;
}
}
return 0;
}
int main()
{
f=fopen("data.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
fscanf(f,
&a[i][j]);
fclose(f);
asociat();
fillc(s,0,m);
fillc(q,1,m);
mind(s,q);
return 0;
}

Rezultate:
128 | P a g e

"%d",

Pentru graful din desenul 12.2 (a) se obin cuplajele:

Exerciii

Des. 12.3

1. Determinai cuplajele maxime de putere maximal n grafurile


de pe desenul 12.3 A, 12.3 B.
2. Determinai cuplajele maxime de putere minimal n grafurile
de pe desenul 12.3 A, 12.3 B
3. Elaborai un program pentru generarea tuturor cuplajelor fr
construcia grafului asociat. G (V , E ), V 20
4. Elaborai un program pentru determinarea cuplajului cu un
numr minim de muchii. G (V , E ), V 20
5. Elaborai un program pentru determinarea cuplajului cu un
numr maxim de muchii. G (V , E ), V 20

129 | P a g e

Bibliografie
1. Sedgewick Th, Algorithms in C, 2001, Addison Wesley
2. Gibbons Alan, Algorithmic ghaph theory, 1999, Addison Wesley
3. ., , 1988, ,

4. .., ,
2001, ,
5. ., ,1981,
,
6. ., . , 1978,
,
7. Cormen Th., Leiserson Ch., Rivest R., Introducere n algoritmi.
Agora, Cluj, 2001.
8. Cristian A.Giumale, Introducere n analiza algoritmilor. Teorie i
aplicaie. Polirom, Iai, 2004
9. Ptru Bogdan. Programarea calculatoarelor. Teora, Bucureti,
1998.
10. Cerchez Em., erban M. Programarea n limbajul C/C++ pentru
liceu. Vol III. Teoria Grafurilor. Polirom, Iai, 2006.
11. ., ., .
. , , 1985

130 | P a g e

Abrevieri i notaii

- disjuncia (operaia logic SAU [OR] )

A B

- din A rezult B.

A B

- A este echivalent cu B

x X, x X

- x aparine X (x nu aparine X)

x X : Q

- submulimea elementelor x din X, care satisfac condiia Q

A B

- A se conine n B (A este submulime a mulimii B)

( X )

- mulimea tuturor submulimilor mulimii X

- conjuncia (operaia logic I [AND] )


- negaia (operaia logic NU [NOT] )

- cardinalul mulimii X

a1 ,..., an

- secven din n elemente

( a , b)

- pereche ordonat

A B

- produs cartezian al mulimilor A i B; mulimea tuturor


perechilor posibile (a, b) : a A, b B

a b

- valoarea elementului

- valoarea elementului i este incrementat cu 1.

- valoarea elementului i este decrementat cu 1.

- valorile elementelor

b este atribuit elementului a .

a i b sunt interschimbate

(a b) (b a)

131 | P a g e

132 | P a g e

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