Sunteți pe pagina 1din 23

1

I. GRAFURI NEORIENTATE
CONEXE. PARCURGERI DE
GRAFURI
Reamintim faptul ca un graf neorientat pune in
evidenta o relatie simetrica, cum ar fi, de exemplu, cea care
exista intre componentele unei retele de calculatoare.
Varfurile unui astfel de graf (calculatoarele din retea) sunt
conectate intre ele prin legaturi de comunicatie directa
(muchiile grafului). Intr-o astfel de retea este necesar ca orice
calculator sa poata comunica cu toate celelalte calculatoare
prezente in retea. De aceea, graful respectiv trebuie sa aiba
unele particularitati.
Fie G = (V,U) un graf neorientat in care
V={x
1
,x
2
,,x
n
}.
Definitia 1 O succesiune de varfuri,
} ,..., , {
2 1 p
k k k
x x x L ) ,..., , 1 (
2 1
n k k k
p
, in care
1
,
+ j j
k k
x x ) 1 ( p j < sunt adiacente, se numeste lant (mers) in
graful G.
Lantul L se poate defini si cu ajutorul muchiilor sale:
L={ ] , [ ],..., , [ ], , [
1 3 2 2 1 p p
k k k k k k
x x x x x x

} ) ,..., 1 (
1
n k k
p
.
Varfurile
p
k k
x x ,
1
se numesc extremitatile lantului L,
iar numarul de muchii care compun lantul L reprezinta
lungimea lantului.
2
Daca varfurile din lantul L sunt distincte, doua cate
doua, lantul se numeste elementar(drum).
Atunci cand muchiile din lantul L sunt distincte, doua
cate doua, lantul se numeste simplu(parcurs).
Se observa ca orice lant elementar este un lant simplu.
Un lant simplu nu intotdeauna este lant elementar.
In continuare, pentru grafurile neorientate, vom utiliza
notiunile de lant, lant elementar, lant simplu.
Definitia 2 Un lant elementar al grafului G care
contine toate varfurile grafului se numeste lant hamiltonian.
Propozitia 1 Numarul lanturilor hamiltoniene din
graful complet K
n
este n! / 2.
Demonstratie. Deoarece primul varf al unui astfel de
lant hamiltonian se poate alege in n moduri, al doilea in n-1
moduri etc. si ultimul varf intr-un singur mod, exista n!
posibilitati de alegere. Fiecare lant hamiltonian se poate
parcurge in doua sensuri (permutari distincte), prin urmare va
trebui sa efectuam impartirea la 2.
Exemplul 1 In graful K
3
exista un numar de 3!/2=3
lanturi hamiltoniene, iar in K
5
exista 5!/2= 60 lanturi
hamiltoniene.
Exercitiu. Aratati ca numarul lanturilor hamiltoniene
din K
n
, cu extremitati fixate, este (n-2)!.
Exemplul 2 Fie graful neorientat G = (V,U) in care
V={1,2,,7}.
3
3 4
1

2
5
7

6
Fig.1.
Lantul L
1
={1,2,3,4,5} este un lant atat elementar cat si
simplu. El are lungimea 4 si ca extremitati varfurile 1 si 5.
Lantul L
2
={6,3,4,5,3,2,1} are lungimea 6, este un lant simplu,
dar nu este elementar.
In acest graf nu exista lant hamiltonian pentru ca va
trebui sa treaca de doua ori prin varful 3.
Definitia 3 Un lant simplu inchis (lant ale carui
extremitati coincid), se numeste ciclu. Un lant elementar
inchis se numeste ciclu elementar.
Exemplul 3 In fig.1, C ={3,4,5,3} este un ciclu
elementar de lungime 3.
Se observa ca C
1
={4,5,3,4} reprezinta acelasi ciclu C.
4
Asadar, prin permutarea varfurilor care compun un
ciclu, nu se va genera un alt ciclu.
Definitia 4 Doua cicluri C, C
1
sunt egale daca
muchiile lor induc acelasi graf partial al subgrafului generat
de varfurile ce apartin acestor cicluri.
Exercitiu: Fie urmatorul graf neorientat:
3
4
2

8
1
7
5
6
Fig.2
Exista cicluri egale in subgraful format din muchiile
trasate cu linie mai groasa ?
Daca lungimea unui ciclu C este un numar par ciclul
se va numi par, altfel ciclul se va numi impar.
Exercitiu: Un graf este bipartit daca si numai daca
toate ciclurile sale sunt pare.
5
Daca in graful G exista cicluri elementare, atunci
lungimea celui mai scurt ciclu elementar se numeste gratia
grafului G (g(G)), iar dimensiunea celui mai lung ciclu
elementar se numeste circumferinta grafului G (c(G)).
Lungimea celui mai scurt lant elementar dintre doua varfuri
oarecare x, y ale grafului G reprezinta distanta de la x la y in
G (d
G
(x,y)). Prin diametrul grafului G se intelege valoarea
d(G)= max{d
G
(x,y) / x,yV}.
Definitia 5 Un graf G=(V,U) se numeste conex daca
exista lant intre oricare doua varfuri distincte ale sale.
Exemplul 4 Urmatorul graf nu este conex.
x
2
x
3
x
6
x
7
x
1
x
5
x
4
x
9
x
8
Fig.3
Exemplul 5 Graful din figura 1, graful K
p,q
sunt
grafuri conexe.
6
Definitia 6 Se numeste componenta conexa a unui
graf neorientat, G = (V,U), un subgraf al lui G, G
0
=(V
0
,U
0
),
conex si maximal.
Maximalitatea trebuie inteleasa in sensul ca nu
exista lant in graful G care sa aiba o extremitate in V
0
si pe
celalalta in V\V
0
.
Numarul (G) = m-n+p se numeste numar ciclomatic
al grafului G=(V,U) (m=1U1, n=1V1, p reprezinta numarul
componentelor conexe ale grafului).
Numarul (G) = n-p se numeste numar cociclomatic.
Exemplul 6 Graful din figura 3 contine doua
componente conexe.
Se observa ca un graf conex consta intr-o singura
componenta conexa, iar un graf neconex se poate reprezenta
in mod unic ca o reuniune disjuncta de componente conexe.
Pe multimea varfurilor unui graf neorientat
G = (V,U), sa definim relatia binara , astfel:
x y daca x=y sau exista un lant care are ca
extremitati varfurile x, y.
Relatia astfel definita, fiind o relatie de echivalenta
(exercitiu!), determina o partitie pe multimea V. Clasele de
echivalenta, corespunzatoare acestei relatii, sunt componentele
conexe ale grafului G.
7
Definitia 7 Un graf neorientat, G = (V,U), se numeste
p-conex daca:
1. 1 + p V
2. prin suprimarea oricarei submultimi cu cel mult
p-1 varfuri se obtine un subgraf conex.
Exemplul 7 Graful prezentat in figura urmatoare este
un graf biconex (2-conex).
1 2
5 4 3
Fig. 4
Definitia 8 Un varf x, al unui graf conex G, se
numeste varf (punct) de articulare, daca subgraful G-x este
neconex.
Daca subgraful G-V' este neconex, atunci submultimea
V V
'
se numeste multime de articulare sau multime
separatoare de varfuri.
Exemplul 8 Un graf biconex (bloc) nu are puncte de
articulare.
Exemplul 9 In fig.1, V' = {3,5} este o
multime separatoare de varfuri. Dar multimea V"={2,3,5,6}?
8
Exemplul 10 Graful K
n
nu admite multimi separatoare
de varfuri.
Exemplul 11 Un graf p-conex, G = (V,U), nu admite
o multime separatoare de varfuri de cardinal mai mic decat p.
Definitia 9 Cel mai mare numar natural p pentru care
graful G = (V,U) este p-conex se numeste numar de
conexiune al grafului (k(G)).
Exemplul 12 Pentru graful din fig.2, k(G)=2. Se
observa ca V' ={1,8} este multime separatoare de varfuri.
Definitia 10 O muchie u din graful conex G se
numeste muchie de legatura (punte) daca graful partial G-u
este neconex.
Daca graful partial G-U', al grafului conex G, este
neconex, atunci U U
'
se numeste multime separatoare de
muchii.
Definitia 11 Un graf, G = (V,U), cu p V se
numeste p-muchie-conex daca nu admite multimi separatoare
de muchii de cardinal strict mai mic decat p.
Definitia 12 Cel mai mare numar natural p pentru
care graful G = (V,U) este p-muchie-conex se numeste
numar de muchie- conexiune.
Exercitiu: Este adevarat ca numarul de muchie-
conexiune pentru graful din fig.2 este 2 ?
9
Definitia 13 O submultime de varfuri ale grafului
G=(V,U), neadiacente doua cate doua, se numeste multime
independenta de varfuri sau multime stabila. Maximul dintre
cardinalele multimilor stabile din graful G se numeste numar
de stabilitate (independenta) al grafului si se noteaza cu
). (G
Exemplul 13 Sa consideram urmatorul graf G=(V,U):
2 3
1 10 4
8 9
5
7 6
Fig.5
Se vede ca V'={2,4,6,8,9},V"={1,3,5,7,10}
sunt multimi stabile. Se poate afirma ca ) (G 5?
Definitia 14 Doua grafuri neorientate G
1
= (V
1
,U
1
) si
G
2
= (V
2
,U
2
) se numesc izomorfe daca exista bijectia
2 1
: V V cu proprietatea ca aplicatia
2 1
: U U ,
10
definita prin
2
)] ( ), ( [ ]) , ([ U y x y x , oricare ar fi
[x,y]
1
U , este o bijectie.
Prin notatia rG se intelege graful care contine r
componente conexe izomorfe cu graful conex G.
Exercitiu:
a) Aratati ca urmatoarele doua grafuri sunt
izomorfe.
y
2
x
1
x
2
y
1
y
4


y
3
x
5
x
3
y
5
x
4
Fig.6
b) Aratati ca urmatorul graf nu este izomorf cu graful
lui Petersen (fig 12) pentru ca nu au o aceeasi structura
interna. Se vor urmari dimensiunile ciclurilor din cele doua
grafuri.
11

Fig.7
Orice graf neorientat se poate scrie sub forma
k k
G r
U
, unde pentru orice
j i
G si G j i , sunt distincte.
Exemplul 14 Fie graful G = (V,U), de forma:
Fig.8
Se observa ca G = 4K
1
3K
2
2K
3
K
1, 2
.
Exemplul 15 Complementarul unui graf neconex este
un graf conex.
12
Exercitiu: Gasiti complementarul grafului G din
fig.II.3.8.
Exista numeroase probleme, din diverse domenii de
activitate, care se pot rezolva folosind grafurile. Rezolvarea
acestor probleme impune o vizitare partiala sau totala a
varfurilor, respectiv muchiilor, grafului respectiv.
Conceptul de graf il vom considera fie explicit cand
acesta are un ordin acceptabil unei reprezentari in calculator,
fie implicit cand, graful fiind de ordin foarte mare, nu poate fi
implementat in intregime in memoria calculatorului. In cazul
implicit, se va utiliza o descriere a elementelor grafului. In
memoria calculatorului se va afla, in fiecare moment, anumite
portiuni ale acestuia care se vor actualiza in mod progresiv.
Indiferent de situatie, vizitarea varfurilor grafului se bazeaza
pe algoritmii de parcurgere (explorare) a grafului respectiv.
Fiind dat un graf neorientat, G = (V,U), si un varf s,
se pune problema de a determina submultimea S de varfuri
accesibile din s. In acest scop se va realiza un proces de
parcurgere a grafului G, pornind de la varful s si examinand,
in mod sistematic, celelalte varfuri accesibile din s, prin
muchii, cu conditia ca fiecare varf sa fie vizitat o singura
data. Scopul actiunii de vizitare a varfurilor grafului este
de a prelucra informatia asociata acestor varfuri.
Un astfel de proces este deosebit de util in acele
probleme in care grafurile sunt folosite ca structuri de date.
13
Graful fiind o structura neliniara de organizare a
datelor, printr-o astfel de vizitare se poate determina o
aranjare liniara a varfurilor, in vederea parcurgerii lor.
In procesul de parcurgere a grafurilor, daca nu este
pusa in evidenta o anume relatie de ordine pe multimea de
varfuri, se va considera, in mod implicit, relatia <
cunoscuta in multimea N.
1. Metoda de parcurgere BF (Breadth First)
Prin algoritmul BF se realizeaza o parcurgere a
grafului in latime.
Se viziteaza un varf initial s, apoi vecinii sai (varfurile
adiacente cu s), dupa aceea vecinii vecinilor lui s (nevizitati
inca ) etc.
Daca graful nu este conex nu se pot vizita toate
varfurile.
Exemplul 16 Prin parcurgerea BF a grafului
neorientat G = (V,U), dat in figura 1, pornind de la varful
initial 1, se obtine: 1,2,3,4,5,6,7.
In constructia algoritmului BF trebuie, ca in fiecare
moment, sa se poata face distinctie intre varfurile vizitate si
cele nevizitate inca. De aceea se vor utiliza:
a) un tablou unidimensional VIZ[ ] cu n componente,
definite astfel:
14

'

vizitat fost a nu k rful v daca 0


vizitat fost a k rful v daca 1
] [
a
a
k VIZ
(kV={1,2,,n})
b) o coada C in care se vor introduce varfurile care
au fost vizitate dar neprelucrate inca, adica nu au fost vizitati
vecinii lor.
Procedura BF consta in scoaterea a cate unui varf
din coada C si, in acelasi timp, introducerea vecinilor
acestuia care nu au fost inca vizitati, vizitandu-i in acelasi
timp.
Pentru un varf oarecare k se pot intalni urmatoarele
situatii:
VIZ[k]=0, k nu se afla in coada, adica varful k nu a
fost vizitat.
VIZ[k]=1, k nu se afla in coada, adica varful k a fost
vizitat si prelucrat.
VIZ[k]=1, k se afla in coada, adica varful k a fost
vizitat dar nu a fost prelucrat.
Orice varf introdus in coada va fi prelucrat.
Algoritmul se incheie atunci cand coada devine vida.
Algoritmul necesita o memorie O(n) pentru tabloul
VIZ[ ] si tot la fel pentru coada C.
Cazul cel mai nefavorabil este cel in care varful initial
s este conectat cu toate celelalte varfuri ale grafului. In acest
15
caz, in coada se vor afla n-1 varfuri.
Sa consideram graful neorientat G=(V,U)
reprezentat prin matricea sa de adiacenta A. In mod normal,
un astfel de algoritm nu este recursiv.
Descrierea algoritmului BF
Utilizam doua variabile de tip intreg p (care retine
pozitia primului element din C ) si q (care retine pozitia
ultimului element din C ).
C //Initial coada C este vida
for k=1,n
VIZ[k]=0; //Initial toate varfurile se considera nevizitate
C[1]=s; //In coada C se memoreaza varful initial s
p=1;
q=1;
VIZ[s]=1;// Se viziteaza varful s, fara a fi prelucrat
while (p q ) {
//Se executa un ciclu while cat timp coada C este nevida
//Se va scoate varful care urmeaza din C, indicat prin p
j = C[p]; //La inceput se va scoate s, vizitandu-se vecinii sai
//Se prelucreaza toti vecinii k ai lui j, nevizitati inca,
//identificandu-i prin parcurgerea liniei j din matricea A.
for k=1,n
if (a[j,k] ==1 and VIZ[k]== 0){
//Varful k, va deveni noul ultim element din C
q=q+1;
16
//Se retine actualul ultim element in C
C[q]=k;
//Se viziteaza varful k
VIZ[k]=1;}
p=p+1; //Se va trece la urmatorul varf care va fi scos din C
}
Se poate verifica corectitudinea algoritmului, in
sensul ca a fost prelucrat, o singura data, fiecare varf.
Primul ciclu for (initializarea) necesita un timp O(n)
(n asignari).
Ciclul while se executa de cel mult n-1 ori ( s este
vizitat anterior).
In corpul ciclului while exista un nou ciclu for ce
contine selectia simpla if care se va executa de cate n ori la
fiecare reluare a lui while. Prin acest for se parcurge linia
corespunzatoare varfului analizat din matricea de adiacenta.
Celelalte instructiuni prezente in algoritm (de
asignare, incrementare) nu afecteaza ordinul de complexitate
al algoritmului .
Asadar, complexitatea algoritmului BF, in cazul
reprezentarii grafului prin matricea sa de adiacenta, este
O(n(n-1)+n) = O(n
2
).
Mai mult, aratati ca este (n
2
) (exercitiu!).
Daca graful G este reprezentat prin liste de adiacenta,
ciclul initial se executa tot in O(n) timpi.
17
Lista L
j
, adica lista vecinilor varfului j, va contine d
j
(valenta varfului j) elemente.
Prin urmare, la fiecare executie a lui while, ciclul for
din corpul sau, se va executa intr-un timp cd
j
, unde c este
o constanta, iar j reprezinta varful care urmeaza a fi
prelucrat si scos din C.
Se stie ca m d
n
k
2
1

.
Deci timpul total este O(n+m).
Mai mult, aratati ca este (n+m) (exercitiu!).
2. Metoda de parcurgere DF (Depth First)
Algoritmul DF se caracterizeaza prin faptul ca
realizeaza o parcurgere a grafului in adancime atat cat este
posibil.
Parcurgerea incepe cu un varf s ales initial.
Prelucrarea unui varf conduce la prelucrarea primului sau
vecin inca nevizitat, apoi se prelucreaza primul vecin al
acestuia care nu a fost inca vizitat etc. Se observa un procedeu
recursiv de parcurgere a grafului.
Aceasta tehnica de parcurgere conduce la efectuarea
unui numar relativ mare de apeluri recursive inainte de a se
intoarce dintr-un apel.
Exemplul 17 Sa consideram urmatorul graf neorientat:
18
2
3 4
1
6
7 5
Fig.9
Metoda DF, aplicata acestui graf, pornind de la varful
initial 1, conduce la vizitarea varfurilor in urmatoarea ordine:
1,2,6,3,4,5,7.
Se observa ca de fiecare data, atunci cand se ajunge la
prelucrarea unui anumit varf, se cauta varful adiacent lui care
nu a fost inca vizitat. Daca nu mai este posibil de a continua,
se revine la varful de la care am plecat ultima data si cautam
un alt varf adiacent cu el care nu a fost inca vizitat (daca
exista).
Prin urmare, algoritmul respectiv este de tip
backtracking.
Parcurgerea DF a unui graf nu este unica pentru ca ea
depinde atat de alegerea varfului initial cat si de ordinea de
vizitare a vecinilor.
Pentru a putea face o comparatie intre cele doua
19
tehnici de parcurgere BF si DF, va trebui data si o varianta
nerecursiva pentru metoda DF.
Spre deosebire de algoritmul BF, in algoritmul DF,
alaturi de tabloul unidimensional VIZ[ ], cu aceeasi
semnificatie ca la metoda BF, se va utiliza o stiva S in care se
respecta ordinea de parcurgere mentionata.
Primul varf adiacent cu cel curent, inca nevizitat, se va
afla in varful stivei.
Se va considera graful neorientat G=(V,U) reprezentat
prin matricea sa de adiacenta A .
Descrierea algoritmului DF
Vom folosi un vector urm[], in care componenta
urm[k] reprezinta varful vecin lui k care urmeaza a fi vizitat
(daca exista). Determinarea acestei componente se va face
parcurgand linia k din matricea de adiacenta A incepand cu
coloana k+1, pana cand se intalneste un vecin al lui k nevizitat
inca. Un astfel de vecin, daca se gaseste, se va pune in varful
stivei, marindu-se corespunzator si pointerul de stiva ps. Daca
nu se gaseste, pointerul de stiva ps se va micsora cu o unitate
cu scopul de a continua cu urmatorul varf.
Exercitiu: Elaborati si implementati un algoritm
recursiv pentru parcurgerea DF a unui graf neorientat.
Sa se stabileasca si complexitatea sa.
20
Tematica propusa
1 Fie G= (V,U ) un graf neorientat conex. Care este
cea mai mare valoare posibila pentru(V(daca (U(=19 si
d(x) 4, xV?
Trasati un graf demonstrativ.
2 Fie G=(V,U) un graf neorientat conex, 3-regular
(loop-free). Calculati dimensiunea maxima pentru V si U
stiind ca are loc relatia U = 2V - 6.
3 Fie G=(V,U) si G
1
=(V
1
,U
1
), doua grafuri
neorientate, si f :V V
1
un izomorfism de grafuri. Este
adevarat ca d
G
(x)=d
G
1
(f(x)) ,xV?
Urmatoarele doua grafuri neorientate sunt sau nu
grafuri izomorfe? Justificati raspunsul.
4 Pentru orice intreg k 2, aratati ca exista un graf
neorientat conex, G=(V,U), cu V =2k si d(x)=3, xV.
21
5 Sa se implementeze un algoritm de verificare a
conexitatii unui graf neorientat. Daca nu este conex, sa se
precizeze numarul componentelor conexe. Stabiliti
complexitatea algoritmului respectiv.
6 Aratati ca doua lanturi elementare de lungime
maxima, intr-un graf neorientat conex, au cel putin un varf
comun.
7 Se considera un graf neorientat, G=(V,U), dat prin
matricea de adiacenta de mai jos.
a) Sa se stabileasca existenta si numarul lanturilor de
lungime 4 de la varful 2 la varful 4(daca exista!).
b) Cate lanturi de lungime 3 sau 4 se gasesc de la
varful 2 la varful 3?
Puneti in evidenta si alte particularitati ale grafului
care are aceasta matrice de adiacenta.
1
1
1
1
1
1
1
1
]
1

0 1 0 0 0 1
1 0 1 0 1 0
0 1 0 1 0 1
0 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
A
22
8 Sa se implementeze un algoritm prin care sa se
decida daca intr-un graf neorientat dat exista cicluri de
lungime 4 sau 3.
9 Un graf neorientat, G = (V,U ), cu V = n, in care
exista trei varfuri speciale numite ac de grad 1, coada de
grad 2 si corp de grad n-2 , se numeste graf scorpion.
Varful ac este adiacent numai cu varful coada,
acesta din urma este adiacent si cu varful corp, iar varful
corp este adiacent cu toate celelalte varfuri, mai putin varful
ac.
De exemplu, pentru n=8, un astfel de graf poate arata
astfel:
2 3 8
1 4 5
7
6
Sa se construiasca si sa se implementeze un algoritm
care sa determine daca un graf dat este graf scorpion, folosind
O(n) testari ale matricei sale de adiacenta.
23
10 Elaborati un algoritm care folosind parcurgerea, in
adancime/ in latime, sa determine numarul componentelor
conexe ale unui graf neorientat. In particular, sa stabileasca
daca un graf neorientat dat este conex.
11 Intr-un graf neorientat, G=(V,U), puteti folosi
tehnica parcurgerii in latime, pentru a elabora un algoritm prin
care se gaseste cel mai scurt ciclu ce contine un anumit varf
dat? In locul parcurgerii in latime, puteti folosi parcurgerea in
adancime?

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