Anda di halaman 1dari 31

ALGORITMICA GRAFURILOR

Conf. Univ. Dr. Silviu Bârză

I. INTRODUCERE ÎN TEORIA GRAFURILOR


1.1. Grafuri neorientate

DefiniŃie. Fie X o mulŃime finită şi nevidă şi U ⊂ {{x, y} x, y ∈ X } .


Numim graf (sau graf neorientat) perechea G = ( X , U ) . Eelemente din mulŃimea
X se numesc noduri sau vârfuri, iar elementele din mulŃimea U poartă numele
de muchii ale grafului.
Un graf se reprezintă grafic printr-o mulŃime de puncte corespunzătoare
vârfurilor grafului şi o mulŃime de segmente corespunzătoare muchiilor. Dacă
pentru un graf există o reprezentare în care să nu existe două segmente care să se
intersecteze, atunci spunem că graful reprezentat este un graf planar.
Pornind de la definiŃie observăm că dacă X are n elemente, atunci U are
cel mult Cn2 elemente.
Dacă A este o mulŃime, vom nota prin A numărul de elemente ale
mulŃimii.
DefiniŃie. Fie G = ( X , U ) un graf şi x ∈ X un nod fixat. Prin gradul
nodului x înŃelegem numărul muchiilor incidente lui x şi notăm acest număr cu
d ( x ) . Dacă d ( x ) = 1 spunem că x este nod terminal. Dacă d ( x ) = 0 spunem
că x este nod izolat.
PropoziŃia 1. Fie G = ( X , U ) un graf în care U = m . Atunci

∑ d ( x ) = 2m .
x∈ X

PropoziŃia 2. Pentru orice graf G = ( X , U ) , numărul vârfurilor de grad


impar este par.
DefiniŃie. Fie G = ( X , U ) un graf.. Numim graf parŃial al lui G, graful
G′ = ( X ,V ) , unde V ⊂ U .
DefiniŃie. Fie G = ( X , U ) un graf. Numim subgraf în G, graful
G′′ = (Y ,V ) , în care Y ⊂ X , iar V = {{x, y} ∈U x, y ∈ Y } .

1
DefiniŃie. Fie G = ( X , U ) un graf cu n vârfuri ( X = n ). Spunem că G
este un graf complet , dacă oricare ar fi x, y ∈ X , avem { x, y} ∈ U (orice două
vârfuri din G sunt conectate sau adiacente).
Graful complet cu n vârfuri se notează prin K n
PropoziŃia 3. Numărul muchiilor lui K n este Cn2 .

DefiniŃie. Fie G = ( X , U ) un graf. Dacă există X 1 şi X 2 astfel încât


X 1 ∩ X 2 = ∅ şi X = X 1 ∪ X 2 ( X admite o partiŃie din dou blocuri X 1 şi X 2 )
şi orice muchie din G uneşte un nod din X 1 cu unul din X 2 (oricare ar fi
e = { x, y} ∈ U , dacă x ∈ X 1 , atunci y ∈ X 2 ) spunem că G este graf bipartit.
DefiniŃie. Fie G = ( X , U ) un graf bipartit cu partiŃiile X 1 şi X 2 . Dacă
X 1 = p şi X 2 = q şi dacă fiecare vârf din X 1 este adiacent cu toate vârfurile
din X 2 (pentru orice x ∈ X 1 şi orice y ∈ X 2 avem { x, y} ∈U ) spunem că G
este un graf bipartit complet, notat K p ,q .
PropoziŃia 4. Graful bipartit complet K p ,q are pq muchii.
DefiniŃie. Fie G = ( X , U ) un graf. Numim lanŃ în G o succesiune de
vârfuri L = ( x0 , x1 ,..., xr ) = x0 x1...xr , astfel încât pentru orice i = 0,1,..., r − 1 ,
xi xi +1 ∈ U (adică o succesiune în care oricare două vârfuri vecine din lanŃ sunt
adiacente).
Fie G = ( X , U ) este un graf şi L = x0 x1...xr un lanŃ în G . Vârfurile x0 şi
xr se numesc extremităŃile lanŃului L iar r se numeşte lungimea lanŃului L ,
notată l ( L ) = r (lungimea unui lanŃ este dată de numărul muchiilor sale sau de
numărul vârfurilor mai puŃin unul).
DefiniŃie. Fie G = ( X ,U ) un graf. LanŃul L din G se numeşte lanŃ
elementar dacă pentru orice 0 ≤ i, j ≤ r , i ≠ j , avem xi ≠ x j (lanŃul trece prin
noduri distincte).
DefiniŃie. Fie G = ( X ,U ) un graf. LanŃul L din G se numeşte lanŃ
{ }
simplu dacă pentru orice 0 ≤ i, j ≤ r − 1 , i ≠ j , avem { xi , xi +1} ≠ x j , x j +1 (toate
muchiile sale sunt distincte).
PropoziŃia 5. Fie G = ( X ,U ) un graf şi L un lanŃ în G . Dacă L este
lanŃ elementar, atunci L este lanŃ simplu.

2
1.2. Grafuri orientate

DefiniŃie. Fie X o mulŃime finită şi nevidă. Numim graf orientat (digraf)


orice pereche G = ( X , U ) în care U ⊂ X × X este o mulŃime finită de perechi
ordonate cu componente din X ( U este o relaŃie binară pe X ).
Elementele mulŃimii X vor fi numite vârfuri sau noduri. Elementele
mulŃimii U se numesc arce.
Orice arc are forma ( a, b ) , în care a se numeşte extremitate iniŃială, iar
b se numeşte extremitate finală a arcului ( a, b ) .
Un graf orientat se reprezint grafic printr-o mulŃime de puncte
corespunzătoare vârfurilor şi printr-o mulŃime de segmente orientate (săgeŃi)
corespunzătoare arcelor..O săgeată este orientat de la extremitatea iniŃial spre
extremitatea finală a arcului pe care îl reprezintă.
Dacă u = ( x, y ) ∈ U spunem că x şi y sunt adiacente în G şi că
nodurile x şi y sunt incidente arcului u sau că arcul u este incident nodurilor x
şi y . Mai exact, spunem că u este incident exterior nodului x ( u pleacă sau iese
din x ) şi că u este incident interior nodului y ( u ajunge sau intră în y ). Arcul
( x, y ) ∈ U se mai notează şi prin xy .
DefiniŃie. Fie G = ( X , U ) un graf orientat şi x ∈ X un nod fixat.
a) Numim grad interior al lui x , numărul arcelor incidente interior lui x ,
adică mărimea d − ( x ) = {( y, x ) ∈U }
y∈ X .
b) Numim grad exterior al lui x , numărul arcelor incidente exterior lui x ,
adică mărimea d + ( x ) = {( x, y ) ∈U }
y∈ X .
c) Prin gradul nodului x înŃelegem numărul total al arcelor incidente lui x ,
adică mărimea d ( x ) = d − ( x ) + d + ( x ) .
d) Dacă d ( x ) = 0 spunem că x ∈ X este vârf izolat.
e) Dacă d − ( x ) = 1 şi d + ( x ) = 0 spunem că x ∈ X este vârf terminal; dacă
d − ( x ) = 0 şi d + ( x ) = 1 spunem că x ∈ X este vârf iniŃial.
DefiniŃie. Fie G = ( X , U ) un graf orientat şi A ⊂ X o mulŃime de
vârfuri.
a) Gradul interior lui A este numărul arcelor ce intră în A şi care au nodul
iniŃial în afara lui A, adică mărimea
d − ( A) = {( y, x ) ∈U }
y ∉ A, x ∈ A .

3
b) Gradul exterior lui A este numărul arcelor ce ies din A şi au nodul
terminal în afara lui A, adică mărimea
d + ( A) = {( x, y ) ∈U x ∈ A, y ∉ A} .
c) Gradul total al lui A este d ( A ) = d − ( A ) + d + ( A ) .
ObservaŃii.
1) Evident, pentru orive A ⊂ X avem d − ( A ) ≤ ∑ d ( x) ,
x∈A
− deoarece s-ar

putea ca anumite arce care ies din A să aibă extremitatea finală tot în A ,
arce care nu se numără la determinarea valorii d + ( A ) .
2) Evident, pentru orive A ⊂ X avem d + ( A ) ≤ ∑ d ( x) ,
x∈A
+ deoarece s-ar

putea ca anumite arce care intră în A să aibă extremitatea iniŃială tot în A ,


arce care nu se numără la determinarea valorii d − ( A ) .
Din 1) şi 2) rezult că d ( A ) ≤ ∑ d ( x) .
x∈A

DefiniŃie. Fie G = ( X , U ) un graf orientat. Numim graf orientat parŃial


al lui G graful orientat G = ( X , V ) în care V ⊂ U .
Un graf orientat parŃial al lui G se obŃine prin suprimarea anumitor arce
ale lui G .
DefiniŃie. Fie G = ( X , U ) un graf orientat. Numim subgraf orientat al
lui G , graful orientat H = (Y , V ) în care Y ⊂ X , iar V = {( x, y ) ∈U x, y ∈ Y }
(mulŃimea tuturor arcelor lui G cu ambele extremităŃi în Y ).
Un subgraf orientat se obŃine suprimând anumite vârfuri din G şi
eliminând toate arcele incidente vârfurilor suprimate.
DefiniŃie. Fie G = ( X , U ) un graf orientat. Dacă pentru orice x, y ∈ X
avem ( x, y ) ∈ U sau ( y, x ) ∈ U spunem că G este graf orientat complet.
Un graf orientat complet cu n vârfuri se noteană cu K n .
ObservaŃie. În cazul grafurilor neorientate, pentru un n ∈ ℕ , n ≥ 2 ,
există un singur graf complet cu n vârfuri, notat K n . În cazul grafurilor orientate
pentru un n ∈ ℕ , n ≥ 2 dat, exist mai multe grafuri orientate complete cu n
vârfuri, ele diferind fie prin orientarea arcelor, fie prin numărul de arce ce unesc
două vârfuri, număr ce poate fi 1 sau 2.

4
DefiniŃie. Fie G = ( X , U ) un graf orientat. Numim drum în G o
succesiune de vârfuri d = ( x0 , x1 ,..., xr ) astfel încât pentru orice i = 0,1,..., r − 1 ,
xi xi +1 ∈ U (sau o succesiune de arce care au acelaşi sens, d = ( u1 , u1 ,..., u p ) , cu
proprietatea că pentru orice i = 1, 2,..., p − 1 , ui şi ui +1 au o extremitate comună,
mai exact extremitatea finală a lui ui coincide cu extremitatea iniŃială a lui ui +1 .
Fie d = ( x0 , x1 ,..., xr ) un drum în graful G = ( X , U ) . x0 se numeşte
extremitatea iniŃială, iar xr extremitatea finală a drumului d .
DefiniŃie. Drumul d = ( x0 , x1 ,..., xr ) din graful G = ( X , U ) se numeşte
elementar dacă pentru orice i, j = 0,1,..., r , i ≠ j , avem xi ≠ x j (drumul trece
prin noduri distincte).
DefiniŃie. Fie G = ( X , U ) un graf orientat. Numim lanŃ în G , o secvenŃă
de noduri L = [ x0 , x1 ,..., xr ] cu proprietatea că pentru orice i = 0,1,..., r − 1 avem
( xi , xi +1 ) ∈U sau ( xi +1 , xi ) ∈U (sau o succesiune de arce
L = u1 , u2 ,..., u p  astfel încât pentru orice i = 1, 2,..., p − 1 , arcele ui şi ui +1 au
o extremitate comună - nu se mai pune condiŃia ca arcele să aibă acelaşi sens, ca
la drumuri).
ObservaŃie. Din definiŃie rezultă imediat că orice drum este într-un graf
orientat este în acelaşi timp şi lanŃ în graful orientat respectiv.
DefiniŃie. Fie G = ( X , U ) un graf orientat. Pentru orice x, y ∈ X
spunem că y este accesibil din x sau y este atins din x dacă şi numai dacă
există d = ( x0 , x1 ,..., xr ) un drum de capete x şi y ..

II. TIPURI PARTICULARE DE GRAFURI

DefiniŃie. Se nume te multigraf un graf neorientat în care cel puŃin două


vârfuri sunt unite prin muchii multiple.
DefiniŃie. Graful orientat G = ( X , U ) se numeşte reflexiv (nereflexiv,
simetric, antisimetric, total, tranzitiv) dacă şi numai dacă relaŃia binară U este
relaŃie binară reflexivă (nereflexivă, simetrică,antisimetrică, totală, tranzitivă).
DefiniŃie. Fie G = ( X , U ) un graf orientat. Dacă pentru fiecare x ∈ X
se asociază o etichetă pentru identificare spunem că G este un graf orientat
etichetat.

5
Observăc că la toate grafurile de mai sus un folosit o numerotare a
vârfurilor. Numerele folosite pot fi considerate etichete pentru vârfuri şi astfel
grafurile pot fi considerate drept grafuri etichetate.
DefiniŃie. Fie G = ( X , U ) un graf orientat. G se numeşte graf orientat
marcat sau reŃea dacă fiecărui u ∈ U i se asociază o marcă mu . În acest caz,
U ⊂ X × M × X , M fiind mulŃimea mărcilor asociate arcelor. Dacă
( x, m, y ) ∈ X × M × X , atunci arcul x → y se marchează cu m şi se reprezint
prin x m
→y.
DefiniŃie. Numim reŃea etichetată un graf orientat marcat şi etichetat.
De fapt, graful din exemplul anterior, având vârfurile numerotate şi
muchiile marcate poate fi considerat şi un exemplu de reŃea etichetată.
2.1. Grafuri conexe

DefiniŃie. Graful neorientat G = ( X , U ) se numeşte conex dacă şi numai


dacă oricare ar fi două noduri x, y ∈ X , x ≠ y , există cel puŃin un lanŃ în G ,
L = ( x0 , x1 ,..., xr ) de extremităŃi x şi y .
DefiniŃie. Fie G = ( X , U ) un graf neorientat. Numim componenta
conexă a lui G , un subgraf conex C = ( Y , V ) al său, şi pentru orice x ∈ Y ,
subgraful obŃinut luând mulŃimea de vârfuri Y \ { x} nu este conex (subgraful C
este maximal în raport cu proprietatea de conexitate).
Fie G = ( X , U ) un graf neorientat. Pentru x, y ∈ X spunem că x este
conectat cu y dacă există un lanŃ ce le uneşte, adică există un lanŃ
L = ( x0 , x1 ,..., xr ) de extremităŃi x şi y
Pe mulŃimea X definim relaŃia binară ~ ⊂ X × X , dată prin x ~ y dacă
şi numai dacă ( x = y sau x este conectat cu y ).
PropoziŃia 1. RelaŃia " ~ " definit mai sus este o relaŃie de echivaleŃă
PropoziŃia 2. Fie G = ( X , U ) un graf în care X = n , U = m şi n ≥ 2 .
Dacă G este conex, atunci m ≥ n − 1 .
NoŃiunea de graf conex este valabilă şi pentru grafurile orientate.
DefiniŃia este următoarea:
DefiniŃie. Graful orientat G = ( X , U ) se numeşte conex dacă şi numai
dacă oricare ar fi două noduri x, y ∈ X , x ≠ y , există cel puŃin un lanŃ în G ,
L = ( x0 , x1 ,..., xr ) de extremităŃi x şi y .

6
Dacă în definiŃia grafului conex pentru grafuri orientate înlocuim
condiŃia de existenŃă a unui lanŃ cu cea de existenŃă a unui drum se onŃine
următoarea noŃiune.
DefiniŃie. Graful orientat G = ( X , U ) se numeşte tare conex dacă şi
numai dacă oricare ar fi două noduri x, y ∈ X , x ≠ y , există cel puŃin un drum în
G , d = ( x = x0 , x1 ,..., xr = y ) de extremităŃi x şi y .
O posibilitate de a determina dacă un graf neorientat este conex, sau
determinarea efectivă a componentelor conexe (sau problemele similare
pentru grafurile orientate) constă în aplicarea unui algoritm de tip greede.
Să considerăm întâi problema determinării conexităŃii unui graf
neorientat G = ( X ,U ) .
Algoritm 1.
1. Se consideră Y = X , V = U şi se alege orice x ∈ X pentru care
considerăm B = { x} .
2. Dacă B = ∅ , atunci algoritmul se termină generând un răspuns
astfel:
a. Dacă V = ∅ , atunci graful este conex
b. Dacă V ≠ ∅ , atunci graful nu este conex (în plus se poate
spune că mulŃimea X \ Y reprezintă componenta conexă din
care face parte şi nodul x considerat la 1).
Altfel se continuă.
3. Se alege orice y ∈ B .
4. Pentru fiecare z ∈Y \ B astfel încât { y, z} ∈V considerăm
B = B ∪ { z} şi V = V \ {{ y, z}}
5. Considerăm B = B \ { y} şi reluăm de la 2.
Aşa cum se vede din pasul 2, algoritmul prezentat dă răspunsul la
întrebarea „Este G un graf conex?”. De asemenea, se poate determina
componenta conexă a grafului G din care face parte un anumit nod
specificat. Acest lucru crează premizele realizării algoritmului de
determinare a componentelor conexe, plecând de la algoritmul 1.
Algoritm 2.
1. Se consideră Y = X , V = U k = 0 .
2. Dacă V = ∅ , atunci algoritmul se termină şi componentele conexe
k
ale grafului G sunt A1 , A2 , ..., Ak . Vârfurile care nu sunt în ∪A k
i =1
sunt vârfuri izolate şi formează fiecare în parte câte o componentă
conexă a grafului G (în plus valoarea pentru k arată dacă graful
7
G este sau nu conex. Astfel pentru k = 1 şi A1 = X graful este
conex, altfel G nu este conex).
3. Alegem orice x ∈ Y . Fie k = k + 1 , Ak = ∅ , B = { x} .
4. Dacă B = ∅ se trece le 8, altfel se continuă.
5. Se alege orice y ∈ B .
6. Pentru fiecare z ∈Y \ B astfel încât { y, z} ∈V considerăm
B = B ∪ { z} şi V = V \ {{ y, z}} .
7. Considerăm B = B \ { y} , Ak = Ak ∪ { y} . Se trece la 4.
8. Se elimină din V orice muchie {a, b} pentru care a, b ∈ Ak . Se trece
la 2.

2.2. Grafuri complementare şi izomorfe

DefiniŃie. Fie G = ( X , U ) un graf neorientat, numim complementarul lui


G (graf complementar lui G ), graful CG = ( X , CU ) , în care { x, y} ∈ CU
dacă şi numai dacă { x, y} ∉ U .
DefiniŃie. Fie G = ( X , U ) şi G′ = ( X ′, U ′ ) două grafuri neorientate.
Spunem că G şi G ′ sunt izomorfe, notăm G ≅ G ′ , dacă există o funcŃie bijectivă
{ }
f : X → X ′ astfel încât { x, y} ∈ U dacă şi numai dacă f ( x ) , f ( y ) ∈ U ′ .
Din definiŃie rezultă că două grafuri sunt izomorfe dacă au acelaşi număr
de vârfuri şi se poat obŃine unul din celălalt printr-o renumerotare a vârfurilor.
DefiniŃii similare celor de mai sus sunt valabile pentru grafurile orientate.
Ele se obŃin înlocuid muchiile cu arce.
PropoziŃia 3. Fie G = ( X , U ) şi G′ = ( X ′, U ′ ) două grafuri orientate.
Atunci G ≅ G ′ dacă şi numai dacă CG ≅ CG ′ .

2.3. Grafuri ciclice

DefiniŃie. Fie G = ( X , U ) un graf neorientat. Numim ciclu în G un lanŃ


L = [ x0 , x1 ,..., xr ] în care x0 = xr (în care extremităŃile coincid).
DefiniŃie. Fie G = ( X ,U ) un graf neorientat şi L = [ x0 , x1 ,..., xr ] un
ciclu. Spunem că L este ciclu elementar dacă pentru orice 0 ≤ i, j ≤ r − 1 , i ≠ j ,
avem xi ≠ x j (toate vârfurile sale, exceptând extremităŃile, sunt distincte două
câte două) .
8
DefiniŃie. Fie G = ( X ,U ) un graf neorientat şi L = [ x0 , x1 ,..., xr ] un
ciclu. Spunem că L este ciclu simplu daca pentru orice 0 ≤ i, j ≤ r − 1 , i ≠ j ,
{ }
avem { xi , xi +1} ≠ x j , x j +1 (toate muchiile sale sunt distincte două câte două).
DefiniŃiile de mai sus continuă să fie valabile şi pentru grafurile
orientate. Suplimentar intervin definiŃiile care urmează.
DefiniŃie. Fie G = ( X , U ) un graf orientat. Numim circuit în G un drum
C = ( x0 , x1 ,..., xr ) în care x0 = xr (în care extremităŃile coincid).
DefiniŃie. Fie G = ( X ,U ) un graf orientat şi C = ( x0 , x1 ,..., xr ) un
circuit. Spunem că C este circuit elementar dacă pentru orice 0 ≤ i, j ≤ r − 1 ,
i ≠ j , avem xi ≠ x j (toate vârfurile sale, exceptând extremităŃile, sunt distincte
două câte două) .
DefiniŃie. Fie G = ( X ,U ) un graf orientat şi C = ( x0 , x1 ,..., xr ) un
ciclu. Spunem că C este circuit simplu daca pentru orice 0 ≤ i, j ≤ r − 1 , i ≠ j ,
( )
avem ( xi , xi +1 ) ≠ x j , x j +1 (toate arcele sale sunt distincte două câte două).
DefiniŃie. Graful neorientat G = ( X ,U ) se numeşte ciclic dacă G
conŃine cel puŃin un ciclu şi se numeşte aciclic în caz contrar.
DefiniŃie. Fie G = ( X , U ) un graf orientat. Spunem că G este aciclic
dacă G nu conŃine nici un circuit şi ciclic în caz contrar.
PropoziŃia 4. Fie G = ( X ,U ) un graf neorientat. Dacă U ≥ X ,
atunci G este ciclic.
DefiniŃie. Fie G = ( X , U ) un graf neorientat având k ≥ 1 componente
conexe. Se numeşte punte în G o muchie m ∈ U pentru care graful parŃial
( )
G′ = X ,U \ {m} are numărul de componente conexe mai mare decât k .
PropoziŃia 5. Fie G = ( X , U ) un graful neorientat şi m ∈ U . m este
punte, dacă şi numai dacă oricare ar fi ciclul C = [ m1 , m2 ,..., mr ] în G dat prin
muchiile sale, m ≠ mi pentru orice 1 ≤ i ≤ r .
PropoziŃia 6. Fie G = ( X ,U ) un graf orientat. G este tare conex
dacă şi numai dacă există un circiut C care conŃine toare vârfurile
grafului.
DefiniŃie. Fie G = ( X ,U ) un graf orientat. Definim
V = {( x, y ) ∈ U ∃C circuit in G cu ( x, y ) ∈ C} . Graful parŃial H = ( X ,V )
se numeşte graful orientat ciclu al lui G .
9
PropoziŃia 7. Fie G = ( X ,U ) un garf orientat şi H = ( X ,V ) graful
ciclu al lui G . Fie Y ⊂ X şi G′ = ( Y ,W ) subgraf. Atunci G′ componentă
tare conexă în G dacă şi numai dacă G′ componentă tare conexă în H .
DefiniŃie. Fie G = ( X ,U ) un graf orientat şi C1 , C2 , ..., Ct
componentele tari conexe ale lui G . Fie Y = {C1 , C2 ,..., Ct } şi

{ }
V = ( Ci , C j ) ∃x ∈ Ci , ∃y ∈ C j cu ( x, y ) ∈ U ⊂ Y × Y .
Graful H = (Y ,V ) se numeşte graful condensat al lui G .
ObservaŃie. Graful condensat al oricărui graf orientat este aciclic.

4. ARBORI
4.1. Definire şi proprietăŃi

DefiniŃie. Numim arbore orice graf neorientat conex şi fără cicluri.


Teorema 1. Fie G = ( X , U ) un graf neorientat. Următoarele afirmaŃii
sunt echivalente:
1. G este arbore.
2. G este aciclic maximal.
3. G este convex minimal.
Corolar. Dacă G = ( X , U ) este arbore, atunci U = X − 1 .
PropoziŃie 1. Dacă G = ( X , U ) este un arbire, atunci G are cel puŃin
două vârfuri terminale.
4.2. Arbori parŃiali

DefiniŃie. Fie G = ( X , U ) un graf neorientat şi H = ( X , V ) un graf


parŃial al lui G . Dacă H este arbore spunem că H este un arbore paŃial (de
acoperire sau de traversare) al lui G .
ObservaŃie. Dacă un graf neorientat G = ( X , U ) are arbore parŃial, acesta
nu este unic.
DefiniŃie. Fie G = ( X , U ) un graf neorientat şi A = ( X , V ) un arbore
parŃial al lui G . Numim coarde ale lui H elementele mulŃimii U \ V , iar numărul
U \ V se numeşte numărul ciclomatic al lui G .
Teorema 2. Fie G = ( X , U ) un graf neorientat. G este conex dacă şi
numai dacă G are arbore parŃial.

10
Algoritm 1.
1. Fie V = U .
2. Dacă graful H = ( X , V ) nu conŃine cicluri, atunci algoritmul se termină şi
H este un arborele parŃial al lui G , altfel se conŃinuă.
3. Se consideră un ciclu C = e1 , e2 ,..., e p  în H

{ }
4. Se alege e ∈ e1 , e2 ,..., e p . Considerăm V = V \ {e} şi mergem la 2.
PropoziŃia 2. Fie G = ( X , U ) un graf neorientat conex. Atunci numărul
ciclomatic al lui G este U − X + 1 .
PropoziŃia 3. Fie G = ( X , U ) un graf neorientat conex, A = ( X , V ) un
arbore parŃial al lui G şi e = { x, y} o coardă a lui A . Atunci graful
H = ( X , V ∪ {e}) conŃine exact un ciclu.

4.3. Algoritmul lui Kruskal

Problema arborelui parŃial de cost minim. Fie G = ( X , U ) un graf


neorientat conex, c : U → ( 0, ∞ ) o funcŃie, numită funcŃie cost a muchiilor lui G
şi H = ( X , V ) un graf parŃial al lui G . Numim costul lui H suma costurilor
tuturor muchiilor din V , adică valoarea c ( H ) = ∑ c ( u ) . Se pune problema
u∈U
determinării în G a unui graf parŃial conex de cost minim.
DefiniŃie. Fie G = ( X , U ) un graf neorientat conex, c : U → ( 0, ∞ )
funcŃia cost a muchiilor lui G şi Tcm = ( X , Vcm ) un arbore parŃial cu proprietatea
că pentru orice arbore parŃial T = ( X , V ) avem c (Tcm ) ≤ c (T ) . Atunci spunem
că Tcm este arbore parŃial de cost minim al lui G .
Teorema 3. Fie G = ( X , U ) un graf neorientat conex, c : U → ( 0, ∞ )
funcŃia cost a muchiilor lui G şi H = ( X , V ) un graf parŃial al lui G . Dacă H
este graf parŃial conex de cost minim, atunci H este arbore parŃial de cost minim.
Algoritmul 2. (Kruskal).
1. Considerăm că L ( i ) = i pentru fiecare i = 1, 2,..., X , construim M ( j ) ,
. j = 1, 2,..., U reprezentând muchiile lui G în ordinea crescătoare a
costurilor, considerăm k = 0 (pentru numărarea muchiilor selectate) şi
j = 1 (pentru parcurgerea lui M ). Fie V = ∅ .

11
2. Dacă k ≥ n − 1 , atunci algoritmul se opreşte, muchiile din V determină
arborele parŃial de cost minim, altfel se continuă.
3. Considerăm { p, q} = M ( j ) .
4. Dacă L ( p ) = L ( q ) , atunci punem j = j + 1 şi mergem la 3, altfel se
continuă.
5. Punem k = k + 1 şi V = V ∪ {{ p, q}} .
6. Dacă L ( p ) < L ( q ) , atunci înlocuim în L toate valorile L ( q ) prin
L ( p ) , altfel înlocuim în L toate valorile L ( p ) prin L ( q ) .
7. Punem j = j + 1 şi mergem la 2.

4.4. ArborescenŃe

DefiniŃie. Fie G = ( X , U ) un graf orientat conex şi aciclic. Dacă există


un unic vârf x0 ∈ X cu d − ( x0 ) = 0 şi pentru orice x ∈ X , x ≠ x0 avem
d − ( x ) ≠ 0 , spunem că G este o arborescenŃă (sau arbore orientat). x0 poartă
numele de rădăcină a arborescenŃei G . Vârfurile y pentru care d + ( y ) = 0 se
numesc vârfuri terminale sau frunze.
DefiniŃie. Fie A = ( X , U ) o arborescenŃă cu rădăcina x0 . Pentru un vârf
x ∈ X definim nivelul nodului prin l ( x0 ,..., x ) , unde ( x0 ,..., x ) este drumul
(unic) de extremitate iniŃială x0 şi extremitate finală x .
DefiniŃia de mai sus plasifică vârfurile arborescenŃelor în funcŃie de
distanŃa lor faŃă de rădăcină. Acestă clasificare are ca efect o reprezentare în care
nodurile sunt poziŃionate pe fiecare nivel, cu rădăcina arborescenŃei în partea
superioară a imaginii.
Pentru o arborescenŃa A = ( X , U ) , dacă ( x, y ) ∈ U , spunem că x este
părintele (tatăl) lui y şi y este fiul (descendentul direct) lui x . Dacă x, y ∈ X
şi există drumul (unic) ( x, z1 ,..., zk , y ) , spunem că y este descendentul lui x .
DefiniŃie. Fie A = ( X , U ) o arborescenŃă. Dacă pentru orice x ∈ X
avem d + ( x ) ∈ {0,1, 2} . Spunem că A este o arborescenŃă binară (arbore binar).
Dacă d + ( x ) ∈ {0, 2} , spunem că A este o arborescenŃă binară completă (arbore
binar complet).
Teorema 4. Pentru orice n ∈ ℕ* există A = ( X , U ) o arborescenŃă
binară astfel încât

12
{x ∈ X d + ( x ) = 0} = n
(numărul vârfurilor terminale să fie egal cu n ).
PropoziŃia 4. Fie A = ( X , U ) o arborescenŃă binară completă în care

{x ∈ X d ( x ) = 0} = n . Atunci U = 2 ( n − 1) .
+

DefiniŃie. Fie A = ( X , U ) o arborescenŃă binară şi


DT = {s ∈ ℕ ∃x ∈ X cu d + ( x ) = 0 si l ( x0 ,..., x ) = s}
(mulŃimea distanŃelor de la rădăcină la fiecare vârf terminal). Dacă
max DT − min DT ≤ 1 , spunem că A este o arborescenŃă binară echilibrată.
Teorema 5. Fie A = ( X , U ) o arborescenŃă binară. Următoarele
afirmaŃii sunt echivalente:
1. A este o arborescenŃă binară echilibrată;
2. pentru orice x ∈ X cu d + ( x ) = 0 , dacă X = 2m , atunci
m = l ( x0 ,..., x ) şi dacă 2m < X < 2m +1 , atunci l ( x0 ,..., x ) ∈ {m, m + 1} .

5. GRAFURI HAMILTONIENE ŞI EULERIENE


5.1. Grafuri Hamiltoniene

DefiniŃie. Fie G = ( X , U ) un graf neorentat. Un lanŃ (ciclu) elementar


din G care conŃine toate vârfurile grafului se numeşte lanŃ (ciclu) hamiltonian .
DefiniŃie. Un graf G = ( X , U ) care con ine cel puŃin un ciclu hamiltonian
se numeşte graf hamiltonian
Aceste noŃiuni se regăsesc şi pentru grafurile orientate sub următoarele
forme.
DefiniŃie. Fie G = ( X , U ) un graf orentat. Un lanŃ (rum, ciclu, circuit)
elementar din G care conŃine toate vârfurile grafului se numeşte lanŃ (drum,
ciclu, circuit) hamiltonian .
DefiniŃie. Un graf G = ( X , U ) care con ine cel puŃin un circiut
hamiltonian se numeşte graf hamiltonian orientat
Facem observaŃia că problematica grafurilor hamiltoniene este una de
complexinate nepolinomială din punctul de vedere al algoritmcii.
Teorema 1. Fie G = ( X , U ) un graf neorientat în care X = n ≥ 3 şi
n
pentru orice vârf x ∈ X avem d ( x ) ≥ . Atunci G este graf hamiltonian.
2

13
5.2. Grafuri euleriene

DefiniŃie. Fie G = ( X , U ) un graf neorientat. Un ciclu simplu din G se


numeşte ciclu eulerian dacă conŃine toate muchiile lui G .
DefiniŃie. Graful neorientat G = ( X , U ) se numeşte graf eulerian dacă
G conŃine cel puŃin un ciclu eulerian.
Dacă trecem în cadrul grafurilor orientate avem definiŃia ce urmează
DefiniŃie. Fie G = ( X , U ) cu U = s un graf orientat Fie
L = [ m1 , m2 ,..., ms ] un lanŃ ( D = ( m1 , m2 ,..., ms ) un drum) simplu, atunci
spunem că lanŃul L (drumul D ) este lanŃ (drum) eulerian..
Lema 1. Fie G = ( X , U ) un graf neorientat, nu neapărat conex. Dacă
pentru orice x ∈ X avem d ( x ) număr par şi pentru x0 ∈ X avem d ( x0 ) ≠ 0 ,
atunci exist un ciclu simplu în G care trece prin x0 .
Teorema 2. Fie G = ( X , U ) un graf neorientat fără vârfuri izolate.
Atunci G este eulerian dacă şi numai dacă G este conex şi pentru orice x ∈ X ,
d ( x ) este număr par.
Teorema 3. Fie G = ( X , U ) un graf conex. Următoarele afirmaŃii sunt
echivalente:
1. G conŃine un ciclu eulerian.
2. Orice x ∈ X , d ( x ) este număr par.

3. Există Ci =  m1i , m2i ,..., mipi  cicluri, mij ∈ U , j = 1, 2,..., p i ,


 
i = 1, 2,..., k , astfel încât notând {
U i = m1i , m2i ,..., mipi } avem
k
U i ∩ U j = ∅ pentru orice 1 ≤ i, j ≤ k , i ≠ j şi ∪U i = U (mulŃimea
i =1
muchiilor poate fi partiŃionată în cicluri).
Corolar 1. Fie G = ( X , U ) un graf conex. G conŃine un lanŃ eulerian
dacă şi numai dacă cel mult două vârfuri ale lui G au gradul impar.
Corolar 2. Fie G = ( X , U ) un graf conex cu 2k vârfuri de grad impar,

k > 0 . Atunci există Li =  m1i , m2i ,..., mipi  lanŃ deschis, mij ∈ U , j = 1, 2,..., p i ,
 
{
i = 1, 2,..., k , astfel încât notând U i = m1i , m2i ,..., mipi } avem U i ∩ U j = ∅

14
k
pentru orice 1 ≤ i, j ≤ k , i ≠ j şi ∪U i = U (mulŃimea muchiilor poate fi
i =1
partiŃionată în exact k lanŃuri deschise).

VI. ALGORITMI PENTRU DRUMURI ÎN GRAFURI ORIENTATE


6.1. Algoritmi de calcul direct

Pentru calculul direct a matricii drumurilor putem folosi în primul rând


operaŃiile + şi i definite în capitolul 3.
Algoritmul are la bază propoziŃia 5 din capitolul 3 şi are forma următoare.
Algoritmul 1.
1. Considerăm i = 1 , D = A şi T = A .
2. Dacă i > n algoritmul se opreşte, D conŃine matricea drumurilor din G ,
altfel se continuă.
3. Considerăm i = i + 1 şi calculăm T = T i A folosind operaŃiile + şi i .
4. Calculăm D = D + T folosind operaŃia + .
5. reluăm cu pasul 2.
Teorema 1. Fie G = ( X , U ) un grad orientat cu matricea de adiaceaŃă
A şi cu X = n . Algoritmul 1 produce matricea drumurilor din G şi are
(
complexitatea O 2n 4 . )
Acest algoritm poate fi considerat şi sub următoarea formă.
Algoritmul 1’.
1. Considerăm D = A .
2. Pentru i = 1, 2,..., n şi pentru j = 1, 2,..., n se execută pasul 4.
3. Algoritmul se opreşte; D conŃine matricea drumurilor lui G .
4. Dacă d ij = 0 , atunci pentru k = 1, 2,..., n se execută pasul 5 altfel se
continuă.
5. Se calculează d ik = dik + d jk .
O altă modalitate de calcul direct foloseşte operaŃiile uzuale definite pe
mulŃimea numerelor naturale.
Algoritmul se bazează pe propoziŃia 6 din capitalul 3 şi pe legătura care
există între matricile DG şi NDG . Algoritmul are forma următoare.
Algoritmul 2.
1. Considerăm i = 1 , D = A şi T = A .
2. Dacă i > n se trece la pasul 6, altfel se continuă.
3. Considerăm i = i + 1 şi calculăm T = T i A folosind operaŃiile uzuale de
adunare şi înmulŃire a numerelor întregi.
15
4. Calculăm D = D + T folosind operaŃia de adunare a numerelor întregi.
5. Reluăm cu pasul 2.
6. Pentru fiecare i = 1, 2,..., n şi fiecare j = 1, 2,..., n se execută pasul 8.
7. Algoritmul se opreşte, D conŃine matricea drumurilor din G
8. Dacă d ij ≠ 0 , atunci face d ij = 1 , altfel se continuă.
Algoritmul 1 este cunoscut sub numele de Algoritmul lui Wharshal pentru
determinarea matricii drumurilor.
6.2. Algoritmul Wharshal pentru drumuri minime în grafuri orientate

De o mare aplicabilitate practică este o problemă de drumuri relatică la


grafurile ponderate. Fie G = ( X , U ) un graf ponderat, deci un graf orientat în care
U ⊂ X × M × X , M fiind mulŃimea ponderilor.
Pentru reprezentarea acestui graf se utilizează o matrice specifică
P = ( pij ) de elemente
1≤i , j ≤ n

mij pentru ( xi , mij , x j ) ∈ U


pij =  .
+∞ altfel
Matricea poartă numele de matricea ponderilor grafului G .
În graful G se poate defini astfel noŃinuea de lungime a unui drum
d= (( x , m
i1 i1i2 )( ) (
, xi2 , xi2 , mi2i3 , xi3 ,..., xi , mi i , xik +1
k k k +1
)) ,
notată prin L ( d ) = , şi dată prin relaŃia
k
L ( d ) = ∑ mi ji j+1 .
j =1

Pentru orice x, y ∈ X , putem defini mulŃimea drumurilor de la x la y ca


{
fiind mulŃimea D ( x, y ) = d = ( x = x0 , x1 ,..., xk = y ) d drum in G . }
O problemă importantă este de a determina în G drumurile minime între
vârfuri. Pentru acest lucru vom defini matricea drumurilor minime, notată
DGmin = ( dij ) , unde
1≤i , j ≤ n

d ij = min L ( d )
(
d ∈D xi , x j )
. Folosind aceste notaŃii, pentru determinarea matricii DGmin a drumurilor
minine se poate face folosind Algoritmul Wharshal pentru drumuri minime,
adică:

16
Algoritmul 3.
1. Considerăm i = 1 (prelucrăm linia i ), D = P .
2. Dacă i > n , atunci algoritmul se termină şi DGmin = D , altfel se continuă.
3. Pentru fiecare j = 1, 2,..., n se aplică pasul 5.
4. Facem i = i + 1 (trecem la următoarea linie) şi trecem la pasul 2.
5. Dacă d ij = +∞ , atunci se continuă, altfel se înlocuieşte liniei i cu
minimul dintre liniei i şi linia obŃinută din linia j prin adăugarea valorii
dij la fiecare element.
Teorema 2. Dacă G = ( X , U ) este un graf orientat ponderat cu P
matricea ponderilor dată pe mulŃimea de ponderi M şi X = n . Algoritmul 3
producea matricea drumurilor minime din graful G şi are complexitatea O n3 ( )
exprimată ca număr de comparaŃii.
6.3. Algoritmul lui Dantzig pentru drumuri minime
de extremitate iniŃială dată

Acest algoritm determină toate drumurile de lungime minimă care pornesc


de la un vârf dat şi ajung la toate celelalte vârfuri.
Se consideră un graf orientat G = ( X , U ) având X = n . Fie xi ∈ X un
vârf considerat iniŃial pentru toate drumurile pe dare dorim să le determinăm. Fie
P = ( pij ) matricea ponderilor definită ca mai sus.
1≤i , j ≤ n

Se consideră următorul proces de calcul:


Algoritmul 4.
1. Considerăm m = 1 , X m = { xi } şi c ( xi ) = 0 .
2. Dacă d + ( X m ) = 0 , atunci ne oprim; altfel se continuă.
3. Pentru orice arc ( x , x ) ∈U
j k pentru care x j ∈ X m şi xk ∉ X m se
calculează valoarea d jk = p jk + c x j ( )
4. Calculăm d = min d jk .
x j ∈X m
xk ∉ X m

5. Pentru fiecare k astfel încât d = d jk considerăm c ( xk ) = d şi


X m +1 = X m ∪ { xk } . Facem m = m + 1 şi trecem la pasul 2.
În urma execuŃiei acestui proces, m este numărul de vârfuri atinse din
vârful xi , X m este mulŃmea acestor noduri şi pentru fiecare x ∈ X m valoarea
c ( x ) indică lungimea unui drum minim de extremitate iniŃială xi şi extremitate
17
finală x . Procesul se termină în cel mult n − 1 repetări ale paşilor 2, 3, 4 şi 5
deoarece la pasul 5 se adaugă cel puŃin câte un vârf la mulŃimea X m .

6.4. Algoritmul lui Bellman-Kalaba pentru drumuri minime


de extremitate finală dată

Acest algoritm rezolvă problema similară celei prezentate la algoritmul


Dantzig, adică determină drumurile de lungime minimă care au extremitatea finală
fixată.
Fie G = ( X , U ) un graf orientat ponderat cu X = { x1 , x2 ,..., xn } . Putem
presupune că dorin să determinăm drumurile de extremitate finală xn . Acest lucru
nu restrânge generalitatea deoarece putem găsi un izomorfism f de grafuri
orientate astfel încât dacă dorim să determinăm drummurile cu extremitatea finală
xi să avem f ( xi ) = xn .
Considerăm că P = pij ( ) 1≤i , j ≤ n
este matricea ponderilor pentru graful G .
Pentru realizarea algoritmului Bellman-Kalaba, construim o versiune modificată a
matrici ponderilor, matricea W = wij ( ) 1≤i , j ≤ n
, definită după cum urmează

mij pentru i ≠ j si ( xi , mij , x j ) ∈ U


 pij pentru i ≠ j 
wij =  = 0 pentru i = j .
0 pentru i = j 
∞ pentru i ≠ j si ( xi , mij , x j ) ∉ U
Algoritmul 5.
Etapa 1
Se construieşte matricea estinsă a valorilor arcelor W = wij ( ) i , j =1, n
.

Construim un tabel în care liniile sunt liniile matricii , notat L = ( Li )1≤i ≤ n , unde Li
este linia i a tabelului La tabelul format se adaugă linia Ln +1 care este transpusa
coloanei n din matricea W .
Etapa 2
Se adaugă tabelului L , liniile suplimentare Li , i = n + 2, n + 3,... , astfel:
a) presupunând completată linia Lk se completează linia Lk +1 conform relaŃiei:

(
Lk +1, j = min Lk , j , min {wk +1,t + Lk ,t } .
t =1,..., n
)
b) se continuă aplicarea punctului (a) până la obŃinerea a două linii Lk şi Lk +1
identice.
Etapa 3

18
Se determină regresiv drumul minim de la xi la x n astfel:
- se adună linia „ i ” din L cu linia Lk +1 urmărindu-se rezultatul minim ce se
poate obŃine. Să presupunem că Lk +1,i = wij + Lk +1,i , atunci primul arc din
drumul minim de la xi la x n este arcul xi , x j ; ( )
- se adaugă linia „ j ” din L cu Lk +1 reŃinând valoare minimă, aflată de
exemplu pe coloana „ k ”, atunci al doilea arc va fi x j , x k ( ) ş.a.m.d. Ultimul
succesor determinat va fi x n .

PropoziŃia 1. Pentru orice k ∈ ℕ avem *

Lk +1,i = min {vij + Lk , j }


j =1, n

PropoziŃia 2. Dacă există k ∈ ℕ* pentru care Lk ,i = Lk +1,i , pentru orice


1 ≤ i ≤ n , atunci Lk ,i = Ls ,i , pentru orice 1 ≤ i ≤ n şi orice s ≥ k + 1 ,
Teorema 3. Fie G = ( X , U ) un graf orientat ponderat cu X = n . Atunci
algoritmul 5 are ca rezultat determinarea tuturor drumurilor minime de
extremitate finală xn şi complexitatea algoritmului este O 2n 2 exprimată ca ( )
număr maxim de comparaŃii.

6.4. Algoritmii lui Ford şi Dijkstra pentru drumuri minime


de extremităŃi date

Comparativ cu algoritmii prezentaŃi mai sus următorul algoritm se


foloseşte pentru cazul în care ambele extremităŃi ale drumului căutat sunt fixate.
Fie G = ( X , U ) un graf orientat şi xi , x j două vârfuri. Dorim să
determinăm un drum optim de la xi la x j . Datorită izomorfiesmelor de grafuri,
putem considera că determinăm un drum de la x1 la xn , fără a restrânge
generalitatea procesului de determinare.
Calculul se realizează în trei faze, una de iniŃializare, una de calcul efectiv
şi una de obŃinere a drumul minim dintre x1 şi xn , dacă există drumuri între cele
două vârfuri.
Considerăm că P = pij ( ) 1≤i , j ≤ n
este matricea ponderilor pentru graful G .
Pentru realizarea algoritmului Bellman-Kalaba, construim o versiune modificată a
matrici ponderilor, matricea W = wij ( ) 1≤i , j ≤ n
, definită după cum urmează

19
mij pentru i ≠ j si ( xi , mij , x j ) ∈ U
 pij pentru i ≠ j 
wij =  = 0 pentru i = j .
0 pentru i = j 
∞ pentru i ≠ j si ( xi , mij , x j ) ∉ U
Algoritmul 6.
Etapa 1
Se construieşte matricea estinsă a valorilor arcelor W = wij ( ) i , j =1, n
.

Construim un vector v = ( vi )1≤i ≤ n pentru care considerăm v1 = 0 şi vi = +∞


pentru 2 ≤ i ≤ n .
Etapa 2
a) Cu i = 1, 2,..., n , în această ordine se construieşte vectorul v* = vi* ( ) 1≤i ≤ n
pe
baza formului:
 
 
v = min vi , min {v j + w ji } .
*
i
j
 ( x j , xi )∈U 
 
b) Se continuă aplicarea punctului (a) cât timp există un indice k pentru care
vk* < vk , înlocuinduse vectorul v prin vectorul v* .
Etapa 3
- Dacă wn = +∞ , atunci nu există drumuri între x1 şi xn .
- Se determină drumul de la x1 la xn plecându-se de la xn , procedând după
cum urmează: dacă presupunem că s-a determinat (x ki , xki−1 ,..., xk1 = xn , )
partea de la xki la x n a drumului minim. Luăm xk vârful pentru care are loc
i+1

relaŃia vk
i+1
+ wki+1ki = vki
Algoritmul prezentat este un algoritm care conŃine o serie de complicaŃii
datorate faptului că s-a dorit să funcŃioneze pentru toate grafurile orientate. Pentru
cazul în care se cunoaşte faptul vă graful G nu conŃine circuite, acest algoritm
poate fi simplificat pentru a se ajunge la următoarea formă.
Algoritmul 7.
1. Se construieşte matricea estinsă a valorilor arcelor W = wij ( ) i , j =1, n
.,

facem v1 = 0 (. v = ( vi )1≤i ≤ n fiind un vector de dimensiune n ) şi


considerăm mulŃimile A = { x1} şi B = X \ { x1} .
2. Dacă nu există x j ∈ A şi xi ∈ B astfel încât ( x , x ) ∈U , atunci ne
j i

oprin, nu există drumuri de la x1 la xn ; altfel se continuă.


20
{
3. Considerăm mulŃimea C = x ∈ B ∃y ∈ A, ( y, x ) ∈ U . Pentru orice }
xi ∈ C , facem vi = min {v j + w ji } .
j
x j ∈A

4. Facem înlocuirile A = A ∪ C , B = B \ C .
5. Dacă xn ∉ A atunci se trece la pasul 2, altfel se continuă.
6. Se determină drumul de la x1 la xn plecându-se de la xn , procedând după

(
cum urmează: dacă presupunem că s-a determinat xk , xk ,..., xk = xn ,
i i −1 1 )
partea de la xki la x n a drumului minim. Luăm xk vârful pentru care
i+1

are loc relaŃia vk


i+1
+ wki+1ki = vki .
Se poate observa că în algoritmul simplificat al lui Ford, în pasurile 3 şi 4
se determină un minim şi apoi are loc o trecere a tuturor vârfurilor din C în A . Pe
de alŃă parte, o parte din arcele considerate la pasul 3 nu vor face parte din drumul
minim de la x1 la xn . Acest lucru se va întâmpla doar pentru vârfurile în care se
{
atinge minimul calculat la aplicarea relaŃiei vi = min v j + w ji . Această
j
}
x j ∈A

consideraŃie ne conduce la un algoritm înbunătăŃit pentru determinarea drumurilor


minime în grafuri fără circuite, cunoscut sub numele de algoritmul lui Dijkstra.
Algoritmul 8.
1. Se construieşte matricea estinsă a valorilor arcelor W = wij ., ( ) i , j =1, n

facem v1 = 0 (. v = ( vi )1≤i ≤ n fiind un vector de dimensiune n ) şi


considerăm mulŃimile A = { x1} şi B = X \ { x1} .
2. Dacă nu există x j ∈ A şi xi ∈ B astfel încât ( x , x ) ∈U , atunci ne
j i

oprin, nu există drumuri de la x1 la xn ; altfel se continuă.

{
3. Considerăm mulŃimea C = x ∈ B ∃y ∈ A, ( y, x ) ∈ U . Pentru orice }
xi ∈ C , facem vi = min {v j + w ji } .
j
x j ∈A

4. Pentru fiecare xk ∈ C pentru care există xj ∈ A astfel încât


vk + w jk = min {v j + w jk } considerăm A = A ∪ { xk } şi B = B \ { xk } .
j
x j ∈A

5. Dacă xn ∉ A atunci se trece la pasul 2, altfel se continuă.

21
6. Se determină drumul de la x1 la xn plecându-se de la xn , procedând după

(
cum urmează: dacă presupunem că s-a determinat xk , xk ,..., xk = xn ,
i i −1 1 )
partea de la xki la x n a drumului minim. Luăm xk vârful pentru care
i+1

are loc relaŃia vk


i+1
+ wki+1ki = vki .

VII.ALGORITMI PENTRU GRAFURI


HAMILTONIENE ŞI EULERIENE

7.1. Algoritmul lui Foulkes pentru drumuri hamiltoniene

Pentru a uşura căutarea drumurilor hamiltoniene într-un graf orientat conex


G = ( X ,U ) , vom face o căutarea a drumurilor hamiltoniene în subcomponente
tari conexe ale grafului G şi apoi vom asambla subdrumurile prin utilizarea
punŃilor prin care sint conectate componentele tari conexe.
Considerăm un graf orientat conex G = ( X , U ) care are matricea de
asiacenŃă A . Din matricea de adiacenŃă putem determina matricea drumurilor D ,
utilizănd modalităŃile prezentate în capitolele anterioare.
Procesul se desfăşoară în 3 etape, una de formare a componentelor tari
conexe din graful G , a doua în care se formează câte un drum hamiltonian în
fiecare din componentele tari conexe şi ultima etapă de formare a unui drum
hamiltonian în G pe baza subdrumurilor determinare în etapa a doua.
Algoritmul 1.
Etapa 1
1.a) Facem M = I + D şi i = 1
1.b) În matricea M se consideră toate liniile formate dour cu
valoarea 1. Vârfurile corespunzătoare acestor linii formeză mulŃimea de
vârfuri Ci .
1.c) Se elimină din matricea M liniile şi coloanele considerate în formarea
mulŃimii Ci .
1.d) Dacă matricea M nu s-a epuizat se trece la pasul (1.b), altfel se continuă
trecând la etapa a doua.
Etapa 2
Se construieşte un grag G′ = ( Y , V ) unde Y = {C1 , C2 ,..., Cr } şi

( C , C ) ∈V
i j dacă şi numai dacă există x ∈ Ci şi există y ∈ C j astfel încât

( x, y ) ∈U .Se formează astfel un drum hamiltonian în G ′ , şi anume drumul


d ′ = ( C1 , C2 ,..., Cr ) .

22
Etapa 3
3.a) Se consideră x1 ∈ C1 şi x2 ∈ C2 pentru care există ( x1 , x2 ) ∈ U . Găsim în
C1 un drum hamiltonian d1 de extremitate iniŃială x1* şi extremitate finală x1
şi în C2 un drum hamiltonian d 2 de extremitate iniŃială x2 şi extremitate
(
finală x2* . Se foremază astfel drumul hamiltonian d1* = d1 , ( x1 , x2 ) , d 2 ) în
graful parŃial al lui G de vârfuri C1 ∪ C2 . Facem i = 3 .
3.b) Dacă i > r ne oprin, s-a obŃinut drumul hamiltonian, altfel se continuă.
3.c) ( )
Dacă există xi ∈ Ci astfel încât xi*−1 , xi ∈ U atunci se trece la pasul (3.d),
altfel se trece la pasul (3.e).
3.d) Se consideră în Ci un drum hamiltonian d i de extremitate iniŃială xi şi
notăm extremitatea sa finală prin xi* . Am format astfel drumul hamiltonian

(
d i* = d i*−1 , ( xi*−1 , xi ) , di ) în graful parŃial al lui G de vârfuri
C1 ∪ C2 ∪ ... ∪ Ci . Facem i = i + 1 şi mergem la pasul (3.b).
3.e) Fie ei partea din drumul d i*−1 care formează acest drum împreună cu d i −1 .
Fie xi′−1 ∈ Ci −1 şi xi ∈ Ci pentru care ( xi′−1 , xi ) ∈ U . ÎmpărŃim drumul d i −1 în
d i′−1 de extremitate finală xi′−1 şi drumul d i′′−1 de extremitate iniŃială xi′−1 şi
extremitate finală xi*−1 . Considerăm un drum d i′′′−1 care pleacă din xi′−1 , trece
xi*−1 şi apoi prin toate celelante vârfuri care apar în drumul d i′′−1 astfel încât
extremitatea finală a lui d i′′′−1 să fie xi′−1 . Se consideră în Ci un drum
hamiltonian d i de extremitate iniŃială xi şi notăm extremitatea sa finală prin
xi* . Considerăm drumul di* = ( di′−1 , di′′′−1 , ( xi′−1 , xi ) , di ) în graful parŃial al lui
G de vârfuri C1 ∪ C2 ∪ ... ∪ Ci . Facem i = i + 1 şi mergem la pasul (3.b).

7.2. Teorema lui Chen

Fie G = ( X , U ) un graf orientat şi fără circuite cu X = { x1 , x2 ,..., xn } .


Considerăm că A este matricea de adiacenŃă a grafului şi putem determina
matricea D a drumurilor din G .

23
Pentru fiecare nod xi notăm cu pi puterea de atingere a vârfului xi , adică
numărul de vârfuri x j pentru care există drum de extremitate iniŃială xi şi
extremitate finală x j .
PropoziŃia 1. Fie G = ( X , U ) un graf orientat şi fără circuite şi

( x , x ) ∈U . Atunci
i j pi ≥ p j , unde pi este gradul de atingere al vârfului xi .
Corolar. Fie G = ( X , U ) un graf orientat şi fără circuite şi care conŃine
un drum de la xi la x j . Atunci pi ≥ p j , unde pi este gradul de atingere al
vârfului xi .
Următoarele rezultate, dintre care primul este cunoscut drept teorema lui
Chen stau la baza algoritmului lui Chen,
Teorema 1. Fie G = ( X , U ) un graf orientat şi fără circuite cu X = n .
G conŃine un drum hamiltonian dacă şi numai dacă are loc relaŃia
n
n ( n − 1)

i =1
pi =
2
unde pi este gradul de atingere al vârfului xi .
Teorema 2. Într-un graf orientat fără circuite, drumul hamiltonian, dacă
există este unic..
Rezultatele prezentate mai sus dau au proces imediat pentru determinarea
drumului hamiltonian într-un graf orientat fără circuite. Prentru acesta vom proceda
după cum urmează:
1. Scriem matricea de adiacenŃă A .
2. Calculăm, prin una din metodele descrise în capitolele anterioare, matricea
drumurilor D . Dacă în această matrice apare cel puŃin o valoare 1 pe
diagonala principală ne oprim pentru că graful G conŃine un circuit şi
teorema lui Chen nu se poate aplica.
3. Se determină puterile de atingere ale vârfurilor ( pi )i =1,2,...,n şi se verifică
n
n ( n − 1)
valoarea de adevăr pentru relaŃia ∑p
i =1
i =
2
. Dacă această relaŃie

nu este verificată atunci graful G nu conŃine un drum hamiltonian.


4. Se ordonează puterile de atingere ale vârfurilor şi dacă σ este permutarea
pentru care are loc relaŃia
n − 1 = pσ (1) > pσ ( 2) > ... > pσ ( n ) = 0 ,
atunci drumul
(
h = xσ (1) , xσ ( 2) ,..., xσ ( n ) )
este drumul hamiltonian căutat.
24
7.3. Algoritmul lui înmulŃirii latine

Algoritmul de determinare a matricii drumurilor are un caracter prea


sintetic, în sensul că prezenŃa unei valori de „ 1 ” în matricea drumurilor nu dă
informaŃii asupra vârfurilor din care se compun drumurile corespunzătoare,
bineînŃeles că nici asupra numărului de drumuri între vârfurile care corespund
acelor valori de „ 1 ”.
Ca un exemplu de algoritm capabil să răspundă acestor deziderate,
prezentăm algoritmul datorat lui Kaufmann, numit aloritmul înmulŃirii latine.
Introducem ca punct de plecare, o matrice M (1) , care în locul valorilor de
„ 1 ” utilizate în matricea obişnuită a arcelor, utilizează însuşi arcul respectiv,
( )
reprezentat prin vârfurile care îl compun. M (1) = mij(1) i , j =1,n , unde

 xi x j dacă există arc de la xi la x j


mij(1) = 
0 în rest
~
Prin suprimarea primei litere în matricea M (1) se obŃine o matrice M (1)
~
numită „a destinaŃiilor posibile”. Se compun matricele M (1) şi M (1) prin operaŃia
de „înmulŃire latină”. M ( ) L Mɶ ( ) .
1 1

ÎnmulŃirea latină a matricilor se face formal ca şi înmulŃirea a două matrici,


fără însumare şi fără înmulŃire efectivă Ńinând cont că:
- produsul latin a două componente participante la calcul este nul dacă cel puŃin
una din ele este nulă.
- produsul latin a două componente participante este nul dacă au vârf comun.
- rezultatul compunerii constă în scrierea în continuare a vârfurilor componente
ale simbolurilor participante.
Prin definiŃia produsului latin avem M ( 2 ) = M (1) L Mɶ (1) ,
M ( 3) = M ( 2) L Mɶ (1) , … Algoritmul continuă până la obŃinerea matricii M ( n −1) ,
deoarece într-un graf cu n vârfuri un drum hamiltonian are n − 1 arce.
În matricea M ( n −1) citim, conform modului de scriere de mai sus toate
drumurile hamiltoniene ale grafului.
Dacă toate elementele lui M ( n −1) sunt zerouri ( M ( n −1) = 0 ), graful nu
admite drum hamiltonian.
ObservaŃie. Procedeul este aplicabil pentru orice tip de graf orientat (cu
sau fără circuit), dar pentru grafurile fără circuite se recomandă algoritmul lui
Chen, întrucât pentru grafuri de dimensiuni mari, algoritmul înmulŃirii latine este
greoi (dar sigur).

25
7.4. Algoritmul lui Fleury pentru drumuri euleriene

Fie G = ( X , U ) un graf conex în care X = n şi U = m . Dorim ca în


graful G să determinăm un ciclu eulerian. Pentru acest lucru, o soluŃie este de a
pleca de la un lanŃ simplu C (iniŃial format dintr-o muchie a grafului) şi la care să
adăugăm muchii încât să păstrăm lanŃul simplu şi în garful care se formează să nu
apară muchii izolate. Dacă nu există şi alte opŃiuni, atunci se utilizează şi muchiile
izolate.
Algoritmul care se bazează pe principiul enunŃat mai sus este cunoscut
drept algoritmul lui Fleury.
Pentru a putea prezenta acest algoritm este necesar să considerăm un mod
special de specificare a lanŃurilor. Până acum am făcut acest lucru fie sub forma
L = { x0 , x1 ,..., xr } , unde xi ∈ X (reprezentarea prin noduri), fie prin
L = {u1 , u2 ,..., us } , unde ui ∈ U având condiŃia ca pentru orice i = 1, 2,..., s − 1
muchiile ui şi ui +1 au o extremitate comună. (reprezentarea prin muchii)..
Reprezentarea utilă a lanŃurilor este o reprezentare combinată în sensul că
sunt prezente atât nodurile cât şi muchiile implicate în formarea lanŃului sub forma
L = { x0 , u1 , x1 , u2 ,..., xr −1 , ur , xr } , unde pentru orice i = 1, 2,..., r avem
ui = { xi −1 , xi } .
Prezentăm în comtinuare algoritmul lui Fleury:
Algoritmul 2.
6. Se alege un vârf x0 ∈ X şi considerăm C0 = { x0 } şi i = 0 .
7. Pentru xi alegem o muchie ui +1 = ( xi , xi +1 ) care nu apare în Ci şi care
nu este izolată în graful parŃial al lui G obŃinut prin eliminarea muchiiler
care formează Ci (sau o muchie izolată din graful parŃial menŃionat, dacă
nu avem altă variantă).. Definim lanŃul
Ci +1 = {Ci , ui +1 , xi +1} = { x0 , u1 , x1 , u2 ,..., xi , ui +1 , xi +1} şi facem i = i + 1 .
8. Dacă i = m ne oprim, Cm este ciclul eulerian, altfel se trece la pasul (2)..
Teorema 3. Dacă G = ( X , U ) este un graf eulerian, atunci orice ciclu
obŃinut prin aplicarea algoritmului 2 este un ciclu eulerian.

7.5. Algoritmul lui Hierholzer pentru drumuri euleriene

O altă idee pentru determinarea unui ciclu eulerian este să determinăm


ciclurile formate cu muchii distincte şi care să aibă câte un nod comun şi unirea
acestor cicluri în ciclul eulerian căutat.
ExistenŃa ciclurilor cu un nod comun este garantată de faptul că graful
considerat este conex.
26
Ideea de mai sus a fost utilizată de Hierholzer pentru realizarea
argoritmului de mai jos, cunoscut drept algoritmul lui Hierholzer.
Fie graful G = ( X , U ) .
Algoritmul 3.
1. Se alege un vârf x0 ∈ X şi plecând de la x0 , prin traversarea fiecărei
muchii neconsiderate formăm un ciclu C0 = u10 , u20 ,..., ur0{ 0
} şi i = 0 .
2. Dacă graful parŃial format cu muchiile cuprinse în ciclul Ci coincide cu
G atunci ne oprim, Ci reprezintă ciclul eulerian căutat, altfel se
continuă.
3. Fie nodul xi , extremitate a muchiei uki din ciclul Ci şi al unei muchii ui*
care nu este în Ci . Pornind de la nodul xi , în graful parŃial al lui G cu
mulŃimea de muchii formată de muchiile nefolosite la formarea lui Ci ,
formăm un ciclu ca la pasul (1), notat Ci* .

{
4. Formăm ciclul Ci +1 = u1i +1 , u2i +1 ,..., uri +1
i +1
} pornin din xi , parcurgând
integral Ci până ajungen din nou la xi şi apoi parcurgând integral Ci*
până se ajunge la xi
5. Facem i = i + 1 şi trecem la pasul (2).

VIII.FLUX MAXIM ÎN REłELE DE TRANSPORT


8.1. ConsideraŃii generale

DefiniŃie. Un graf orientat ponderatt G = ( X , U , p ) fără circuite, se


numeşte reŃea de transport dacă îndeplineşte următoarele condiŃii:
1. Dacă X = {x1 , x 2 ,..., x n }, atunci oricare ar fi 1 ≤ i ≤ n avem ( xi , xi ) ∈ U .
2. Există un vârf unic x1 ∈ X în care nu intră nici un arc, numit sursa reŃelei.
3. Există un unic vârf x n din care nu iese nici un arc, numit destinaŃia reŃelei.
4. G este conex şi există drumuri de la x1 la x n .
5. S-a definit o funcŃie c : U → ℝ astfel încât c(u ) ≥ 0 pentru orice arc u ∈ U ;
numărul c(u ) se numeşte capacitatea reŃelei.
DefiniŃie. Fie G = ( X , U , p ) o reŃea de transport. Fiind dată o
submulŃime Y ⊂ X , se numeşte tăietură de suport Y mulŃimea de arce
ω − (Y ) = {( x , x ) ∈U x ∉ Y , x ∈ Y } ⊂ U
i j i j

27
ω + (Y ) = {( x , x ) ∈U x ∈ Y , x ∉ Y } ⊂ U .
i j i j

( )
Cantitatea c ω − (Y ) = ∑p ij este capacitatea tăieturii ω − (Y ) .
( )
xi , x j ∈ω− (Y )

DefiniŃie. Fie G = ( X , U , p ) o reŃea de transport. O funcŃie ϕ : U → ℝ +


se numeşte flux pe reŃeaua de transport G = ( X , U , p ) dacă îndeplineşte
următoarele condiŃii:
1. CondiŃia de mărginire a fluxului:
( )
pentru orice xi , x j ∈ U , avem 0 ≤ ϕ xi , x j ≤ p ij . ( )
2. CondiŃia de conservare

∑ ϕ(xk , x j ) = ∑ ϕ(x , xh ) .
n n
Pentru orice xi ∈ X , avem j
k =1 h =1
( )
xk , x j ∈Γ  x , x ∈Γ
 j h

ObservaŃii.
1. CondiŃia 2) afirmă că pentru orice vârf x cu x ≠ x1 şi x ≠ x n , suma
fluxurilor de pe arcele care intră în x este egală cu suma fluxurilor pe arcele
care ies din x .
2. FuncŃia ϕ nu este unică.
DefiniŃie. Fie G = ( X , U , p ) o reŃea de transport. Un arc xi , x j ∈ U se ( )
numeşte arc saturat, dacă în raport cu ϕ are loc relaŃia ϕ xi , x j = pij . ( )
Se pune problema determinării funcŃiei ϕ astfel încât suma fluxurilor pe
arcele ce intră în x n să fie maximă, aşa-numita problemă a fluxului maxim.
Adică, dintre toate fluxurile ϕ :U → ℝ + posibile în reŃeaua de transport
G = ( X ,U , p ) se urmăreşte să se determine fluxul ϕ̂ pentru care
n n

∑h =1
ϕˆ ( xh , xn ) ≥ ∑
h =1
ϕ ( xh , xn ) .
( xh , xn )∈U ( xh , xn )∈U
PropoziŃia 1. Fie G = ( X , U , p ) o reŃea de transport având sursa x1 ,
destinaŃia x n şi ϕ :U → ℝ + un flux oarecare în reŃeaua G , atunci:
n n

∑ ϕ ( x1 , xi ) = ∑ ϕ ( x j , xn )
i =1 j =1
( x1 , xi )∈U ( x j , xn )∈U
DefiniŃie. Fie G = ( X , U , p ) o reŃea de transport având sursa x1 ,
destinaŃia x n şi ϕ :U → ℝ + un flux oarecare în reŃeaua G . Valoarea
28
Φ= ∑ ϕ ( x j , xn ) = ∑ ϕ ( x1 , xi )
( x j , xn )∈ω − ( xn ) ( x1 , xi )∈ω + ( xi )
se numeşte valoarea totală a fluxului ϕ : Γ → ℝ + .
PropoziŃia 2. Fie G = ( X , U , p ) o reŃea de transport şi fie Y ⊂ X o
submulŃime cu proprietăŃile:
- pentru sursa x1 a lui G avem x1 ∉ Y ;
- pentru destinaŃia x n a lui G avem x n ∈ Y .
Atunci pentru orice flux ϕ :U → ℝ + avem
Φ= ∑ ϕ(xi , x j ) − ∑ (
ϕ(xi , x j ) ≤ c ω = (Y ) . )
( )
xi , x j ∈ω− (Y ) ( )
xi , x j ∈ω+ (Y )

8.2. Algoritmul Ford-Fulkerson

În continuare vom considera că toate capacităŃile sunt numere raŃionale sau


întrucât numărul total de arce este finit, chiar numere naturale.
Pe baze consideraŃiilor precedente se deduce următorul algoritm cunoscut
sub numele de algoritmul Ford-Fulkerson pentru determinarea fluxului maxim
într-o reŃea de transport.
Algoritm
Pasul I
Se construieşte un flux iniŃial ϕ 0 , care verifică condiŃiile de conservare în
fiecare vârf şi de mărginire pe fiecare arc, de exemplu chiar fluxul având
componente nule pe fiecare arc al reŃelei, ϕ0 xi , x j = 0 , oricare ar fi ( )
( x , x ) ∈U .
i j

Pasul II
Folosind operaŃiile de marcare ce vor fi prezentate mai jos, se cercetează
dacă fluxul iniŃial ϕ 0 este maxim; operaŃiunile de marcare constau în
următoarele:
a) se marchează sursa reŃelei x1 cu semnul „ + ”;
b) vârfurile x j ∈ ω + ( x1 ) vor fi marcate cu „ + x1 ” dacă arcul x1 , x j ( ) este
nesaturat;
c) dacă vârful x j este deja marcat şi dacă pentru un vârf x k ∈ ω + x j ( ) arcul
(x , x ) este nesaturat, atunci marcăm vârful x
j k k prin „ + x j ”;
d) dacă vârful x j este deja marcat şi dacă pentru un vârf x k ∈ ω − x j ( ) arcul
(x x ) are fluxul nenul, marcăm vârful x
k j k prin „ − x j ”.;

29
În urma terminării operaŃiei de marcare, putem întâlni următoarele
situaŃii:
1. Dacă destinaŃia x n a reŃelei nu s-a marcat, atunci fluxul este maxim şi
algoritmul se termină, altfel se aplică procesul (2) şi se reia pasul II.
2. Dacă destinaŃia x n s-a putut marca, atunci fluxul nu este maxim şi poate fi
măsurat astfel:
a) se alege un drum de la x1 la x n ;
b) pe arcele drumului marcat cu „ + ” fluxul se majorează cu o cantitate θ
de flux (de exemplu θ = 1 );
c) pe arcele drumului marcat cu „-“ fluxul se micşorează cu aceeaşi
cantitate θ ;
d) fluxul arcelor nemarcate nu se schimbă;
Algoritmul are un număr finit de paşi, iar fluxul maxim se atinge când nu mai
poate fi marcată destinaŃia x n a reŃelei.
ObservaŃie. Mărimea fluxului se poate face cu mai mult decât o unitate,
evitându-se astfel prea multe operaŃii de marcare, astfel: se consideră un drum V
format din drumuri marcate cu „+” sau „-“ ce uneşte x1 cu x n , uşor de găsit
urmărind vârfurile marcate în sensul de la x n către x1 . Notăm V + mulŃimea
arcelor ( x, y ) unde y este marcat cu „+” şi V − mulŃimea arcelor ( x, y ) unde y
este marcat cu „-“. Calculăm
θ1 = min+ {c(u ) − ϕ(u )}
u∈V

θ 2 = min− ϕ(u )
u∈V

şi θ = min{θ1 , θ 2 }. Observăm că θ > 0 şi este număr întreg.


Mărim cu θ pe fiecare arc u ∈V + şi micşorăm cu θ pe fiecare arc u ∈V − ,
obŃinând la ieşire un flux mărit cu θ .
Se repetă etapa a doua cu fluxul obŃinut. Valoarea fluxului maxim se găseşte
realizând o tăietură prin separarea cu o linie a vârfurilor marcate de cele nemarcate
şi capacitatea acestei tăieturi reprezintă fluxul maxim, sau adunând fluxurile
arcelor incidente interior lui x n .

BIBLIOGRAFIE Obligatorie

1. I. Tomescu, Combinatorică şi teoria grafurilor, Editura UniversităŃii.


Bucureşti, 1990
2. I. Tomescu, Probleme de combinatorică şi teoria grafurilor, Editura
Didactică şi Pedagogică, Bucureşti, 1981. EdiŃia engleză: Problems in
Combinatorics and Graph Theory, John Wiley, New York , 1985.

30
BIBLIOGRAFIE OpŃiomală

1. Bang-Jensen, G. Gutin, Digraphs Theory, Algorithms and Applications,


Springer-Verlag, 2007
2. M. Behzad, G. Chartrand, L. Lesniak-Foster, Graphs & Digraphs, Prindle,
Weber & Schmidt, Boston, Massachusetts, 1979.
3. B. Bollobas, Graph Theory. An Introductory Course, Springer-Verlag,
New York, Heidelberg, Berlin, 1979.
4. C. Berge, Teoria grafurilor şi aplicaŃii, Editura Tehnica, Bucuresşi, 1971

31