Sunteți pe pagina 1din 12

Alexandru Cohal

Noiembrie 2013

Cuprins

Introducere .............................................................................................................. 3
Reprezentarea Grafurilor n memorie ..................................................... 3
Reprezentarea prin Matrice de Adiacen ................................................. 3
Reprezentarea prin Liste de Adiacen ....................................................... 4
Reprezentarea prin Lista Muchiilor / Arcelor.......................................... 5

Grafuri ponderate ................................................................................................ 5


Parcurgerea grafurilor ..................................................................................... 6
Parcurgerea n adncime (DFS)..................................................................... 6
Parcurgerea n lime (BFS)............................................................................ 7

Conexitate ................................................................................................................ 8
Tare - Conexitate ................................................................................................. 9
Grafuri hamiltoniene ....................................................................................... 10
Grafuri euleriene ............................................................................................... 11
Aplicaii ................................................................................................................... 12
Legturi ................................................................................................................... 12
Bibliografie............................................................................................................ 12

Introducere
(cteva noiuni elementare)
Un graf (orientat sau neorientat) este o pereche ordonat de mulimi
= (, ).
Mulimea este o mulime nevid i finit de elemente denumite vrfurile grafului.
Mulimea este o mulime de perechi de vrfuri din graf. n cazul grafurilor orientate,
perechile de vrfuri din mulimea sunt ordonate i sunt denumite arce. n cazul grafurilor
neorientate, perechile de vrfuri din mulimea sunt neordonate i sunt denumite muchii.
Perechea ordonat format din vrfurile i se noteaz (, ); vrful se numete
extremitate iniial a arcului (, ), iar vrful se numete extremitate final a arcului (, ).
Perechea neordonat format din vrfurile i se noteaz [, ]; vrfurile i se
numesc extremitile muchiei [, ].
Dac exist un arc sau o muchie cu extremitile i , atunci vrfurile i sunt
adiacente; fiecare extremitate a unei muchii / unui arc este considerat inciden cu muchia /
arcul respectiv.

Reprezentarea Grafurilor n memorie


Reprezentarea prin Matrice de Adiacen
Fie = (, ) un graf neorientat. S notm cu numrul de vrfuri din graf.
Matricea de adiacen este o matrice ptratic, avnd linii i coloane, cu elemente
din mulimea {0, 1}, astfel:
[][] = 1 dac exist muchia [, ] n graf
[][] = 0 n caz contrar.
Exemplu:
1
2
3
4

0
1
1
1

1
0
0
0

1
0
0
1

1
0
1
0

Fie = (, ) un graf orientat. S notm cu numrul de vrfuri din graf.


Matricea de adiacen este o matrice ptratic, avnd linii i coloane, cu elemente
din mulimea {0, 1}, astfel:
[][] = 1 dac exist arcul (, ) n graf
[][] = 0 n caz contrar.
Exemplu:
1
2
3
4

0
1
1
1

0
0
0
0

0
0
0
0

0
0
1
0

Observaii
Matricea de adiacen a unui graf neorientat este simetric fa de diagonala
principal, n timp ce matricea de adiacen a unui graf orientat nu este simetric fa de
diagonala principal.
Dimensiunea spaiului de memorie necesar pentru reprezentarea unui graf prin
matrice de adiacen este (2 ).
Implementare
Metoda clasic prin declararea i folosirea unei matrici de dimensiunea
.

Reprezentarea prin Liste de Adiacen


Fie = (, ) un graf neorientat sau orientat cu vrfuri.
Pentru a reprezenta graful prin liste de adiacen, vom reine pentru fiecare vrf al
grafului toate vrfurile cu proprietatea c exist muchia [, ] (pentru graf neorientat),
respectiv exist arcul (, ) (pentru graf orientat), formnd liste de adiacen. Ordinea n care
sunt memorate vrfurile ntr-o list de adiacen nu conteaz.
Exemple:
1
1
2
3
4

2 3 4
1
1 4
3 1

1
1
2
3
4

1
1 4
1

Implementare
Cu vectori clasici fiecare list de adiacen este reprezentat ca un vector cu
maxim componente n care vrfurile sunt memorate pe poziii consecutive
Cu liste nlnuite fiecare list de adiacen este reprezentat ca o list
nlnuit; se reine pentru fiecare element al listei adresa spre urmtorul element precum i
informaia util
Cu vectori din STL fiecare list de adiacen este reprezentat ca un vector din
STL ().

Reprezentarea prin Lista Muchiilor / Arcelor


Pentru a reprezenta un graf neorientat prin lista muchiilor, respectiv un graf orientat
prin lista arcelor, se utilizeaz un vector cu componente, unde este numrul de muchii /
arce din graf. Pentru fiecare muchie / arc vor fi reinute cele dou extremiti.
n cazul muchiilor, ordinea extremitilor nu conteaz. n cazul arcelor, va fi reinut
mai nti extremitatea iniial i apoi cea final.
Exemple:
1

1 1 1 3 2
2 3 4 4 3

2 3 3 4 4
1 1 4 3 1

Implementare
Cu reprezentarea unei muchii / unui arc printr-o structur cu dou cmpuri; Se
va folosi un singur vector de lungime cu elemente de tip structur; Vectorul poate fi declarat
static, dinamic sau ca vector din STL ()
Prin folosirea a doi vectori de lungime (sau a unei matrice cu dou linii i
coloane); Vectorii / Matricea pot fi definii static, dinamic sau ca vectori din STL ().

Grafuri ponderate
n numeroase situaii practice modelate cu ajutorul grafurilor, fiecare muchie / arc a / al
grafului are asociat un anumit cost sau o anumit pondere (de exemplu, lungimea cablului
necesar pentru conectarea a dou calculatoare ntr-o reea, costul de transport pe o anumit rut,
profitul obinut dintr-o anumit tranzacie etc.).
Graful = (, ) (orientat sau neorientat) nsoit de o funcie : , prin care se
asociaz fiecrei muchii / arc din graf un numr real se numete graf ponderat.
Pentru a reprezenta un graf ponderat trebuie s reinem i costurile asociate muchiilor /
arcelor.
Astfel, matricea de adiacen devine matricea costurilor, o matrice ptratic avnd
linii i coloane (unde este numrul de vrfuri din graf), definit astfel:
C[][] va fi costul muchiei / arcului de la la dac exist, sau o dac = ,
sau o valoare special, care depinde de problem, indicnd faptul c nu exist muchie / arc de
la la .
n listele de adiacen nu vom reine doar vrfurile adiacente, ci i costurile arcelor /
muchiilor corespunztoare.
n lista muchiilor / arcelor vom aduga pentru fiecare muchie un cmp suplimentar
(costul).
5

Exemple:

Parcurgerea grafurilor
Parcurgerea unui graf presupune examinarea sistematic a vrfurilor grafului, cu scopul
prelucrrii informaiilor asociate vrfurilor.
Exist dou metode fundamentale de parcurgere a grafurilor:
parcurgerea n adncime (Depth First Search - DFS)
parcurgerea n lime (Breadth First Search - BFS).

Parcurgerea n adncime (DFS)


Parcurgerea ncepe cu un vrf iniial, denumit vrf de start. Se viziteaz mai nti vrful
de start. La vizitarea unui vrf se efectueaz asupra informaiilor asociate vrfului o serie de
operaii specifice problemei.
Se viziteaz apoi primul vecin nevizitat al vrfului de start. Vrful este considerat vecin
al vrfului dac exist muchia [, ] (pentru graf neorientat), respectiv arcul (, ) (pentru
graf orientat).
Se viziteaz n continuare primul vecin nevizitat al primului vecin al vrfului de start, i
aa mai departe, mergnd n adncime pn cnd ajungem ntr-un vrf care nu mai are vecini
nevizitai. Cnd ajungem ntr-un astfel de vrf, revenim la vrful su printe (vrful din care
acest nod a fost vizitat). Dac acest vrf mai are vecini nevizitai, alegem primul vecin nevizitat
al su i continum parcurgerea n acelai mod. Dac nici acest vrf nu mai are vecini nevizitai,
revenim n vrful su printe i continum n acelai mod, pn cnd toate vrfurile accesibile
din vrful de start sunt vizitate.
Exemplu:

Parcurgnd graful din figur n adncime considernd drept vrf de start vrful 3 putem
obine urmtoarea ordinea de vizitare a vrfurilor accesibile din nodul de start:
3, 4, 1, 2, 6, 7, 10, 5, 9
(Pentru aceast succesiune, ordinea de vizitare a vecinilor unui vrf este ordinea
cresctoare a numerelor lor)
Implementare:
Graful va fi reprezentat prin liste de adiacen (n una dintre cele trei variante).
Pentru a reine care vrfuri au fost deja vizitate n timpul parcurgerii vom utiliza un vector ,
cu componente din mulimea {0, 1}, cu semnificaia
[] = 1 dac vrful a fost deja vizitat, respectiv 0, n caz contrar.
Observnd c ordinea de parcurgere complet a vecinilor unui nod este ordinea
invers a atingerii lor, abordarea cea mai simpl folosit pentru parcurgerea efectiv este cea
recursiv.
Observaii:
Complexitatea parcurgerii n adncime (DFS) n cazul reprezentrii prin liste
de adiacen este ( + ) (n cazul reprezentrii prin matrice de adiacen complexitatea este
(2 )).

Parcurgerea n lime (BFS)


Parcurgerea n lime ncepe, de asemenea, cu un vrf iniial, denumit vrf de start. Se
viziteaz mai nti vrful de start. Se viziteaz n ordine toi vecinii nevizitai ai vrfului de
start. Apoi se viziteaz n ordine toi vecinii nevizitai ai vecinilor vrfului de start i aa mai
departe, pn la epuizarea tuturor vrfurilor accesibile din vrful de start.
Exemplu:

Considerm nodul 3 ca nod de start.


Se viziteaz mai nti vrful de start 3. Apoi se viziteaz, n ordine, vecinii nevizitai ai
lui 3, deci 4, 5 i 9. Se viziteaz apoi, n ordine, vecinii nevizitai ai lui 4 (vrfurile 1 i 2) ,
apoi ai lui 5 (vrful 10) i apoi ai lui 9 (care nu are vecini nevizitai). Se viziteaz apoi vecinii
vrfului 1 (vrfurile 6 i 7) i parcurgerea s-a ncheiat (deoarece vrful 2 nu mai are vecini
nevizitai, nici vrful 10 i nici vrfurile 6 i 7).
Concluzionnd, ordinea n care sunt vizitate vrfurile grafului la parcurgerea BFS cu
vrful de start 3 este :
3, 4, 5, 9, 1, 2, 10, 6, 7.

Implementare:
Graful va fi reprezentat prin liste de adiacen (n una dintre cele trei variante).
Pentru a reine care vrfuri au fost deja vizitate n timpul parcurgerii vom utiliza un vector ,
cu componente din mulimea {0, 1}, cu semnificaia
[] = 1 dac vrful a fost deja vizitat, respectiv 0, n caz contrar.
Observnd c ordinea de parcurgere complet a vecinilor unui nod este exact
ordinea atingerii lor, abordarea cea mai simpl folosit pentru parcurgerea efectiv este cea
care folosete o coad (pentru a reine ordinea vizitrii elementelor). Aceast coad poate fi
implementat clasic (printr-un vector cu elemente; variabilele i rein poziia
de nceput, respectiv de sfrit a cozii) sau cu ajutorul STL-ului ().
Observaii:
Parcurgerea n lime are o proprietate remarcabil: fiecare vrf este vizitat pe
cel mai scurt drum / lan ncepnd din vrful de start.
Complexitatea parcurgerii n lime (BFS) n cazul reprezentrii prin liste de
adiacen este ( + ) (n cazul reprezentrii prin matrice de adiacen complexitatea este
(2 )).

Conexitate
Un graf se numete conex dac oricare ar fi i vrfuri din graf exist lan ntre i
.
Exemple:

Graf neorientat conex

Graf orientat conex

Graf neorientat neconex (de exemplu, ntre vrfurile 1 i 3


nu exist lan)

Se numete component conex un subgraf conex maximal cu aceast proprietate


(adic, dac am mai aduga un vrf i toate muchiile/arcele incidente cu acesta, subgraful
obinut nu ar mai fi conex).

Observaii:
Orice graf neconex conine cel puin dou componente conexe.
Componentele conexe ale unui graf sunt disjuncte.
Componentele conexe ale grafului constituie o partiie a mulimii vrfurilor
grafului.

Descompunerea unui graf neorientat n componente conexe


A descompune un graf n componente conexe nseamn a determina toate
componentele conexe ale grafului.
A determina componenta conex a unui vrf presupune a determina toate vrfurile
accesibile din vrful ; deci este suficient s realizm o parcurgere a grafului (n lime sau n
adncime) cu vrful de start .
Pentru a descompune graful n componente conexe, vom realiza cte o parcurgere pentru
fiecare component conex (selectnd ca vrf de start vrful nevizitat avnd numr minim).
Observaii:
Pentru a descompune un graf orientat n componente conexe, se va face
abstracie de orientarea arcelor.
Pentru un graf reprezentat prin liste de adiacen, descompunerea n componente
conexe utiliznd parcurgerea grafului are complexitatea ( + ). Dac graful este reprezentat
prin matrice de adiacen, descompunerea n componente conexe utiliznd parcurgerea grafului
are complexitatea (2 ).

Tare - Conexitate
Un graf orientat se numete tare-conex dac oricare ar fi i vrfuri din graf exist
drum de la la i drum de la la .
Exemple:

Graf orientat tare-conex

Graf orientat care nu este tare-conex (de exemplu,


de la vrful 1 la vrful 8 exist drum, dar
de la 8 la 1 nu exist)
Se numete component tare-conex un subgraf tare-conex maximal cu aceast
proprietate (adic dac am mai aduga un vrf i toate arcele incidente cu acesta, subgraful
obinut nu ar mai fi tare-conex).
9

Observaie:
Componentele tare-conexe constituie o partiie a mulimii vrfurilor grafului.

Descompunerea unui graf orientat n componente tare - conexe


A descompune un graf n componente tare-conexe nseamn a determina toate
componentele tare-conexe ale grafului.
Componentele tare-conexe ale celui de-al doilea graf din exemplul precedent sunt
subgrafurile generate de mulimile de vrfuri: {1, 5, 6, 7}, {3,4, 8} i {2}.

Algoritmul Kosaraju-Sharir (1978)


1. Se parcurge graful n adncime i se numeroteaz vrfurile grafului n postordine
(vrful x este numerotat dup ce toi succesorii si au fost numerotai); n vectorul
se memoreaz ordinea vrfurilor.
2. Se determin graful transpus .
3. Se parcurge graful transpus n adncime, considernd vrfurile n ordinea invers
a vizitrii lor n parcurgerea DFS a grafului iniial.
4. Fiecare subgraf obinut n parcurgerea DFS a grafului transpus reprezint o
component tare-conex a grafului iniial.
Observaie:
Pentru graful reprezentat prin liste de adiacen, complexitatea algoritmului
Kosaraju-Sharir de descompunere n componente tare-conexe este de ordinul ( + ).

Grafuri hamiltoniene
Un graf neorientat se numete hamiltonian dac el conine un ciclu hamiltonian.
Un graf orientat se numete hamiltonian dac el conine un circuit hamiltonian.
Un ciclu / circuit elementar se numete hamiltonian dac el trece prin toate vrfurile
grafului.
Exemple:

Graf neorientat hamiltonian

10

Graf orientat hamiltonian

Grafuri euleriene
Un graf neorientat se numete eulerian dac el conine un ciclu eulerian.
Un graf orientat se numete eulerian dac el conine un circuit eulerian.
Un ciclu / circuit se numete eulerian dac el trece prin fiecare muchie / arc al grafului
exact o dat.
Exemple:

Graf neorientat eulerian (un ciclu eulerian este:


[1, 3, 2, 6, 4, 3, 5, 6, 1])

Graf orientat eulerian (un circuit eulerian este:


[1, 3, 6, 2, 3, 5, 6, 4, 2, 1])

11

Aplicaii
Sortaret (Infoarena)
Dfs (Infoarena)
Bfs (Infoarena)
Ctc (Infoarena)
Mere (.campion)
Prieteni3 (.campion)
Turn1 (.campion)
Chei (.campion)
Reinvent (.campion)
29C (Codeforces)
Program1 (.campion)
Bile1 (.campion)
Drumuri1 (.campion)
Coment (.campion)
Grafxy (.campion)
Sate (Infoarena)
Soldati (.campion)
Fotbal2 (Infoarena)
Dfs (.campion)
Jungla (.campion)
Fazan (.campion)

Legturi
MIT Course: Graph Teory and Coloring
MIT Course: Graph Teory II: Minimum Spanning Trees
MIT Course: Graph Teory III

Bibliografie
Emanuela Cerchez, Marinel erban, Programarea n limbajul C/C++ pentru
liceu volumul III, Editura Polirom, Iai, 2006

Alexandru Cohal
alexandru.cohal@yahoo.com
alexandru.c04@gmail.com
Noiembrie 2013
12