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 1 2 3 4 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 1 2 3 4 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

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 2 3 4 5

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

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