Documente Academic
Documente Profesional
Documente Cultură
10.1. Definiii
Un graf, n cea mai larg accepiune a termenului, poate fi definit ca fiid o colecie
de noduri i arce. o Un nod este un obiect care poate avea un nume i eventual alte proprieti asociate o Un arc este o conexiune neorientat ntre dou noduri. Notnd cu N mulimea nodurilor i cu A mulimea arcelor, un graf G poate fi precizat formal prin enunul G=(N,A). n figura 10.1.a. (a),(b) apar dou exemple de grafuri.
b c e d 2 3
Fig.10.1.a. Exemple de grafuri Ordinul unui graf este numrul de noduri pe care acesta le conine i se noteaz cu |G|. Arcele definesc o relaie de inciden ntre perechile de noduri. Dou noduri conectate printr-un arc se numesc adiacente, altfel ele sunt independente. Dac a este un arc care leag nodurile x i y (a~(x,y)), atunci a este incident cu x,y.
o Singura proprietate presupus pentru aceast relaie este simetria [10.1.a] -----------------------------------------------------------(x,y)A =>(y,x)A unde A este mulimea arcelor. [10.1.a] ----------------------------------------------------------- Un graf poate fi definit astfel nct s aib un arc a~(x,x). o Un astfel de arc se numete bucl ("loop"). o Dac relaia de inciden este reflexiv, atunci fiecare nod conine o astfel de bucl. Exist i posibilitatea ca s existe mai multe arce care conecteaz aceeai pereche de noduri. o ntr-un astfel de caz se spune c cele dou noduri sunt conectate printr-un arc multiplu. n figura 10.1.a (b) este reprezentat un graf cu bucl i arc multiplu.
Grafurile n care nu sunt acceptate arce multiple se numesc grafuri simple. Numrul de arce incidente unui nod reprezint gradul nodului respectiv. o Se numete graf regulat acel graf n care toate nodurile sunt de acelai grad.
ntr-un graf complet de ordinul n notat cu Kn, fiecare pereche de noduri este adiacent. o n figura 10.1.b. apar reprezentate grafurile complete pn la ordinul 6.
K0
K1
K2
K3
K4
K5
K6
Fig.10.1.b. Exemple de grafuri complete Un graf se numete planar dac el poate fi astfel reprezentat ntr-un plan, nct oricare dou arce ale sale se intersecteaz numai n noduri [GG78]. O teorem demonstrat de Kuratowski precizeaz c orice graf neplanar conine cel puin unul din urmtoarele grafuri de baz: 1. 5-graful complet (K5), sau 2. Graful utilitar n care exist dou mulimi de cte trei noduri, fiecare nod fiind conectat nodurile din cealalt mulime.
Fig.10.1.c. Graf utilitar Un graf se numete bipartit dac nodurile sale pot fi partiionate n dou mulimi distincte N1 i N2 astfel nct orice arc al su conecteaz un nod din N1 cu un nod din N2. o Spre exemplu graful utilitar este un n acelai timp un graf bipartit. Fie G=(N,A) un graf cu mulimea nodurilor N i cu mulimea arcelor A. Un subgraf al lui G este graful G'= (N',A') unde:
1. N'este o submulime a lui N; 2. A' const din arce (x,y) ale lui A, astfel nct x i y aparin lui N'. n figura 10.1.d apare un exemplu de graf (a) i un subgraf al su (b).
a b a b
Fig.10.1 d. Graf i un subgraf al su Dac mulime de arce A' conine toate arcele (x,y) ale lui A pentru care att x ct i y sunt n N', atunci G' se numete subgraf indus al lui G [AH85]. Un graf poate fi reprezentat n manier grafic marcnd nodurile sale i trasnd linii care materializeaz arcele. o n acelai timp ns, un graf poate fi conceput ca i un tip de date abstracte, independent de o anumit reprezentare. o Spre exemplu fig.10.1.e (a) respectiv (b) reprezint unul i acelai graf. o Un graf, poate fi definit spre exemplu preciznd doar mulimea nodurilor i mulimea arcelor sale.
G A B D F E C J K J L M F (a) (b) D K G H I L M I B H
A C
Fig.10.1.e. Reprezentri echivalente ale unui graf n anumite aplicaii, cum ar fi exemplul cu traseele aeriene, poziia nodurilor (oraelor) este precizat fizic prin amplasarea lor pe harta real a statului, rearanjarea structurii fiind lipsit de sens. n alte aplicaii ns, cum ar fi planificarea activitilor, sunt importante nodurile i arcele ca atare independent de dispunerea lor geometric.
n cadrul capitolului de fa vor fi abordai algoritmi generali, care prelucreaz colecii de noduri i arce, fcnd abstracie de dispunerea lor geometric, cu alte cuvinte fcnd abstracie de topologia grafurilor. Se numete drum (path) de la nodul x la nodul y, o secven de noduri n1,n2,...,nj n care nodurile succesive sunt conectate prin arce aparinnd grafului. o Lungimea unui drum este egal cu numrul de arce care compun drumul. o La limit, un singur nod precizeaz un drum la el nsui de lungime zero.
Un drum se numete simplu dac toate nodurile sale, exceptnd eventual primul i ultimul sunt distincte. Un ciclu (bucl) este un drum simplu de lungime cel puin 1, care ncepe i se sfrete n acelai nod. Dac exist un drum de la nodul x la nodul y se spune c acel drum conecteaz cele dou noduri, respectiv nodurile x i y sunt conectate. Un graf se numete conex, dac de la fiecare nod al su exist un drum spre oricare alt nod al grafului, respectiv dac oricare pereche de noduri aparinnd grafului este conectat. o Intuitiv, dac nodurile se consider obiecte fizice, iar conexiunile fire care le leag, atunci un graf conex rmne unitar, indiferent de care nod ar fi suspendat n aer.
Un graf care nu este conex este format din componente conexe. o Spre exemplu, graful din fig.10.1.a este format din trei componente conexe.
O component conex a unui graf G este de fapt un subgraf indus maximal conectat al su [AH 85]. Un graf se numete ciclic dac conine cel puin un ciclu. o Un ciclu care include toate arcele grafului o singur dat se numete ciclu eulerian (hamiltonian). o Este uor de observat c un asemenea ciclu exist numai dac graful este conex i gradul fiecrui nod este par.
Un graf conex aciclic se mai numete i arbore liber. o n fig.10.1.f apare un graf constnd din dou componente conexe n care fiecare component conex este un arbore liber. o Se remarc n acest sens, observaia ca arborii sunt de fapt cazuri particulare ale grafurilor. o Un grup de arbori neconectai formeaz o pdure (forest).
Un arbore de acoperire (spanning tree) al unui graf, este un subgraf care conine toate nodurile grafului iniial, dar dintre conexiuni numai attea cte sunt necesare formrii unui arbore. o Se face precizarea c termenul de acoperire n acest context are sensul termenului cuprindere.
Fig.10.1.f. Graf aciclic format din dou componente conexe n figura 10.1.g este prezentat un graf (a) i un arbore de acoperire al grafului (b).
A B D F (a) C
A B D C
F (b)
Fig.10.1.g. Graf i un arbore de acoperire al grafului Un arbore liber poate fi transformat ntr-un arbore ordinar dac se suspend arborele de un nod considerat drept rdcin i se orienteaz arcele spre rdcin. Arborii liberi au dou proprieti importante: 1. Orice arbore liber cu n noduri conine exact n-1 arce (cte un arc la fiecare nod, mai puin rdcina); 2. Dac unui arbore liber i se adaug un arc el devine obligatoriu un graf ciclic. De aici rezult dou consecine importante i anume: 1. Un graf cu n noduri i mai puin de n-1 arce nu poate fi conex; 2. Pot exista grafuri cu n noduri i n-1 arce care nu sunt arbori liberi. (Spre exemplu dac au mai multe componente conexe). Notnd cu n numrul de noduri ale unui graf i cu a numrul de arce, atunci a poate lua orice valoare ntre 0 i (1/2)n(n-1).
o Graful care conine toate arcele posibile este graful complet de ordinul n (Kn). o Graful care are relativ puine arce (spre exemplu a<nlog2n) se numete graf rar (sparse) o Graful cu un numr de arce apropiat de graful complet se numete graf dens. Dependena fundamental a topologiei unui graf de doi parametri (n i a), face ca studiul comparativ al algoritmilor utilizai n prelucrarea grafurilor s devin mai complicat din cauza posibilitilor multiple care pot s apar. o Astfel, presupunnd c un algoritm de prelucrare a unui graf necesit un efort de calcul de ordinul O(n2) n timp ce un alt algoritm care rezolv aceeai problem necesit un efort de ordinul O((n+a)log2n) pai, atunci, n cazul unui graf cu n noduri i a arce, este de preferat primul algoritm dac graful este dens, respectiv al doilea dac graful este rar. Grafurile prezentate pn n prezent se numesc i grafuri neorientate i ele reprezint cea mai simpl categorie de grafuri. Prin asocierea de informaii suplimentare nodurilor i arcelor, se pot obine categorii de grafuri mai complicate. Astfel, ntr-un graf ponderat (weighted graph), fiecrui arc i se asociaz o valoare (de regul ntreag) numit pondere care poate reprezenta spre exemplu o distan sau un cost. n cadrul grafurilor orientate (directed graphs), arcele sunt orientate, avnd un sens precizat, de la x la y spre exemplu. o In acest caz x se numete coada sau sursa arcului iar y vrful sau destinaia sa. o Pentru reprezentarea arcelor orientate se utilizeaz sgei sau segmente direcionate (fig.10.1.h. (a), (b),(c)).
x (a)
1 A G
3 F (b) E (c)
Fig.10.1.h. Grafuri orientate Grafurile orientate ponderate se mai numesc i reele (networks).
Informaiile suplimentare referitoare la noduri i arce nuaneaz i n acelai timp complic manipularea grafurilor care le conin.
Fiecare nod are o cheie care identific n mod univoc nodul. Modelul matematic, notaiile utilizate i setul de operatori preconizat pentru
aceast variant apar n [10.2.1.a]: -----------------------------------------------------------TDA Graf (Varianta 1 - Shiflet) [10.2.1.a] Modelul matematic: graful definit n sens matematic. Notaii: TipGraf TipElement TipCheie - tipul de date abstract graf; - tipul asociat poriunii element a nodului - tipul asociat poriunii cheie a unui element TipInfo - tipul corespunzator poriunii de informaie a unui element TipIndicNod - tip referin la structura unui nod TipIndicArc - tip referin la structura unui arc
Operatori: 1. InitGraf(g: TipGraf); - procedur care creeaz graful vid g; 2. GrafVid(g: TipGraf):boolean; - operator care returneaz true dac graful este vid respectiv false n caz contrar; 3. GrafPlin(g: TipGraf):boolean; - operator boolean care returneaz true dac graful este plin. Se precizeaz faptul c aceast funcie este legat direct de maniera de implementare a grafului. Valoarea ei adevrat presupune faptul c zona de memorie alocat structurii a fost epuizat i n consecin nu se mai pot aduga noi noduri.
4. CheieElemGraf(g: TipGraf, e: TipElement): TipCheie; operator care returneaz cheia elementului e aparinnd grafului g. 5. CautaCheieGraf(g: TipGraf; k: TipCheie); - operator boolean care returneaz valoarea adevrat dac cheia k este gsit n graful g. 6. IndicaNod(g: TipGraf; k: TipCheie; var indicNod: TipIndicNod); - operator care face ca IndicNod s indice acel nod din g care are cheia k, presupunnd c un astfel de nod exist. 7. IndicaArc(g: TipGraf; k1,k2: TipCheie; var indicArc: TipIndicArc);- operator care face ca indicArc s indice arcul care conecteaz nodurile cu cheile k1 i k2 din graful g, presupunnd c arcul exist. n caz contrar indicArc ia valoarea indicatorului vid. 8. ArcVid(g: TipGraf; indicArc: TipIndicArc):boolean; operator boolean care returneaz valoarea adevrat dac arcul indicat de indicArc este vid. 9. InserNod(var g: TipGraf; e: TipElement); - operator care nsereaz un nod e n graful g ca un nod izolat (fr conexiuni). Se presupune c naintea inseriei n g nu exist nici un nod care are cheia identic cu cheia lui e. 10. InserArc(var g: TipGraf; k1,k2: TipCheie);- operator care nsereaz n g un arc incident nodurilor avnd cheile k1 i k2. Se presupune c cele dou noduri exist i c arcul respectiv nu exist naintea inseriei. 11.SuprimNod(var g: TipGraf; indicNod: TipIndicNod); operator care suprim din g nodul precizat de indicNod, mpreun cu toate arcele incidente. Se presupune c naintea suprimrii, un astfel de nod exist. 12.SuprimArc(var g: TipGraf; indicArc: TipIndicArc); operator care suprim din g, arcul precizat de indicArc. Se presupune c naintea suprimrii un astfel de arc exist. 13.ActualizNod(var g: TipGraf; indicNod: TipIndicNod: x: TipInfo); - operator care plaseaz valoarea lui x n poriunea informaie a nodului indicat de indicNod din graful g. Se presupune c indicNod precizeaz un nod al grafului. 14.FurnizeazaNod(g:TipGraf; indicNod: TipIndicNod): TipElement; - operator care returneaz valoarea elementului memorat n nodul indicat de indicNod n graful g.
15.TraversGraf(var g: TipGraf; Vizit (ListArgumente)) operator care realizeaz traversarea grafului g, executnd pentru fiecare element al acestuia procedura Vizit(ListaArgumente), unde Vizit este o procedur specificat de utilizator iar ListArgumente este lista de parametri a acesteia. ---------------------------------------------------------
10.3. Tehnici de implementare a tipului de date abstract graf n vederea prelucrrii grafurilor concepute ca i tipuri de date abstracte (TDA) cu
ajutorul sistemelor de calcul, este necesar la primul rnd stabilirea modului lor de reprezentare.
Aceast activitate const de fapt din desemnarea unei structuri de date concrete care s
materializeze n situaia respectiv tipul de date abstract graf.
(1) De natura grafurilor de implementat (1) De natura i frecvena operaiilor care se execut asupra lor. n esen se cunosc dou modaliti majore de implementare a grafurilor: una bazat
pe matrici de adiacene iar celalat pe structuri de adiacene. 10.3.1. Implementarea grafurilor cu ajutorul matricilor de adiacene.
Cel mai direct mod de reprezentare al unui tip de date abstract graf l constituie
matricea de adiacene (adjacency matrix).
Dac
se consider graful G=(N,A) cu mulimea nodurilor N={1,2,...,n},atunci matricea de adiacene asociat grafului G, este o matrice A[n,n] de elemente booleene, unde A[x,y] este adevrat dac i numai dac n graf exist un arc de la nodul x la nodul y.
Primul pas n reprezentarea unui graf printr-o matrice de adiacene const n stabilirea
unei corespondene ntre numele nodurilor i mulimea indicilor matricei.
Aceast coresponden poate fi realizat: (1) n mod implicit prin alegerea corespunztoare a tipului de baz al
mulimii N
n cazul corespondenei explicite, pentru implementarea asocierii pot fi utilizate: Tehnici specifice simple cum ar fi cele bazate pe tablouri sau liste sau Tehnici mai sofisticate bazate spre exemplu pe arbori binari sau pe metoda
dispersiei.
a b c d e
a b c (a) d e
a b c d e
1 0 1 0 0
0 1 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1
(b)
Se observ faptul c reprezentarea are un caracter simetric ntruct fiind vorba despre
un graf neorientat, arcul care conecteaz nodul x cu nodul y este reprezentat prin dou valori n matrice: A[x,y] respectiv A[y,x].
Astfel, pe de-o parte nu toate limbajele de programare sunt propice unei astfel
de implementri,
Pe de alt parte algoritmii care prelucreaz astfel de matrici sunt oarecum mai
complicai dect cei care prelucreaz matrici integrale.
Acest lucru nu este ns obligatoriu i poate fi reconsiderat de la caz la caz. n continuare se prezint dou studii de caz pentru implementarea TDA graf cu
ajutorul matricilor de adiacene. 10.3.1.1. Studiu de caz 1.
Dup cum s-a precizat, un graf este definit prin mulimea nodurilor i prin mulimea
arcelor sale.
n acest scop, este necesar a se preciza modul n care se vor introduce n memoria
sistemului de calcul elementele celor dou mulimi.
(2) O alt posibilitate o reprezint urmtoarea: n prima etap se citesc numele nodurilor n vederea asocierii
acestora cu indicii matricei de adiacene
Pornind de la aceste perechi se genereaz matricea de adiacene. Se face precizarea c prima etap poate s lipseasc dac n
implementarea asocierii se utilizeaz o metod implicit.
var j,x,y,N,A: integer; n1,n2: TipNod; graf: array[1..maxN,1..maxN] of boolean; {N = nr.de noduri, A = nr.de arce} begin readln(N,A); [10.3.1.1.a] for x := 1 to N do for y := 1 to N do graf[x,y]:= false; for x := 1 to N do graf[x,x]:= true; for j := 1 to A do begin readln(n1,n2); x:= index(n1); y := index(n2); graf[x,y]:= true; graf[y,x]:= true end end. {Creare matrice de adiacente} ------------------------------------------------------------
De asemenea nu este precizat nici codul aferent funciei index, acestea depinznd
direct de maniera de reprezentare a nodurilor.
Studiul de caz 2 prezint o metod mai elaborat de implementare a unui TDA graf,
utiliznd drept suport limbajul PASCAL.
TipElement = record Cheie: TipCheie; Info : TipInfo end; TipContor TipIndex TipTablouElem TipMatrAdj = = = = 0..NumarNoduri; 1..NumarNoduri; array[TipIndex] of TipElement; array[TipIndex,TipIndex] of boolean; [10.3.1.2.a]
Arce end;
: TipMatrAdj
TipArc = record linie, coloana : TipIndex end; var g k,k1,k2 e indicNod indicArc : : : : : TipGraf; TipCheie; TipElement; TipIndex; TipArc;
------------------------------------------------------------
(1) contor care precizeaz numrul de noduri, (2) noduri tabloul care pstreaz nodurile propriu-zise (3) arce matricea de adiacene a grafului (fig.10.3.1.2.a.(b)).
Alteori nodurile nu conin nici un fel de informaii (nici mcar cheia) situaie n care
intereseaz numai numele nodurilor n vederea identificrii lor n cadrul reprezentrii.
(2) Informaia coninut de tabloul noduri poate fi ordonat sau neordonat. Dac tabloul noduri este ordonat, localizarea unei chei n cadrul
operatorilor CautCheieGraf sau IndicaNod se poate realiza prin tehnic cutrii binare
Dac tabloul noduri este neordonat localizarea unei chei se poate realiza
prin tehnica cutrii liniar.
Operatorul CautCheieGraf indic numai dac cheia este prezent sau nu Operatorul
IndicaNod(g:TipGraf; k:TipCheie; var indicNod:TipIndicNod) asigneaz lui IndicNod indexul nodului din graful g, care are cheiea egal cu k.
Operatorul IndicaArc(g:
TipGraf; k1,k2:TipCheie; var indicArc:TipArc) se comport ntr-o manier similar, returnnd indexul nodului k1 n variabila de ieire indicArc.linie i indexul nodului k2 n indicArc.coloan.
(3) Inseria unui nod depinde de asemenea de maniera de organizarea datelor n cadrul
tabloului noduri. (a) Dac noduri este un tablou neordonat, se incrementeaz g.contor i se memoreaz nodul de inserat n g.noduri[g.contor].
(b)
begin [10.3.1.2.b] g.contor:= g.contor + 1; g.noduri[g.contor]:= e; {se plaseaz nodul nou} for i:= 1 to g.contor do g.arce[i,g.contor]:= false; {se iniializeaz matricea for j:= 1 to g.contor do de adiacente pt. nodul g.arce[g.contor,j]:= false nou} end; {InserNod} ------------------------------------------------------------
(b) Dac n tabloul noduri informaiile sunt ordonate, atunci: n prealabil trebuie determinat locul n care se va realiza inseria Dup acesta, trebuiesc realizate mutri de elemente n tabloul g.noduri Urmate de mutri de linii i de coloane n matricea de adiacene
g.arce.
(a) Dac tabloul noduri este neordonat, stergerea lui c se poate realiza prin
mutarea ultimului element al tabloului n locul su.
n final se decrementeaz variabila g.contor. Procedura care implementeaz aceste activiti se numete SuprimNod i
apare n secvena [10.3.1.2.c]. -----------------------------------------------------------{Suprimarea unui nod. (Tabloul noduri neordonat)} procedure SuprimNod(var g: Graf; indicNod: TipIndex); var i,j: TipIndex; begin g.noduri[indicNod]:= g.noduri[g.contor]; [10.3.1.2.c] for j:= 1 to g.contor do g.arce[indicNod,j]:= g.arce[g.contor,j]; for i:= 1 to g.contor do g.arce[i,indicNod] := g.arce[i,g.contor]; g.contor := g.contor - 1 end; {SuprimNod} ------------------------------------------------------------
(b) Dac tabloul noduri este sortat, atunci suprimarea presupune: Mutarea cu o poziie a tuturor nodurilor care au indexul mai mare ca
indicNod din tabloul noduri
Exist ns posibilitatea de a terge arce fr a modifica mulimea nodurilor. n acest scop se utilizeaz procedura SuprimArc(g:
indicArc: TipArc) secvena [10.3.1.2.d]. TipGraf;
n concluzie n studiul de caz 2, crearea unei structuri pentru un TDA graf presupune
dou etape:
pentru noduri i
Adugarea unui arc care conecteaz nodul x cu nodul y n cadrul acestui mod de
reprezentare presupune n cazul grafurilor neorientate, inseria nodului x n lista de adiacene a lui y i inseria lui y n lista de adiacene a nodului x.
-----------------------------------------------------------{Cazul 1. Construcia unui graf utiliznd structuri de adiacene implementate cu ajutorul listelor nlnuite simple} const maxN = 100; type RefTipNod = ^TipNod; TipNod = recod nume: integer; urm: RefTipNod end; {TipNod} var j,x,y,N,A: integer; v: RefTipNod; StrAdj: array[1..maxN] of RefTipNod; begin readln(N,A); [10.3.2.1.a] for j:= 1 to N do StrAdj[j]:= nil; for j:= 1 to A do begin readln(n1,n2); x:= index(n1); y:= index(n2); NEW(v); v^.nume:= x; v^.urm:= StrAdj[y]; StrAdj[y]:= v; {inserie n fa} NEW(v); v^.nume:= y; v^.urm:= StrAdj[x]; StrAdj[x]:= v {inserie n fa} end end; ----------------------------------------------------------- n figura 10.3.2.1.a se prezint reprezentarea grafic a structurii construite pornind de la graful (a) din aceeai figur.
Se observ c un arc oarecare (x,y) este evideniat n dou locuri n cadrul structurii,
att n lista de adiacene a lui x, ct i n cea a lui y.
Ordinea n care apar arcele n lista de adiacene, afecteaz la rndul ei ordinea n care
sunt prelucrate arcele de ctre algoritm.
Astfel, o structur de adiacene este de fapt o list nlnuit a nodurilor grafului. Pentru fiecare nod al acestei liste se pstreaz o list a arcelor, adic o list
nlnuit a cheilor nodurilor adiacente.
{Cazul 2. Implementarea grafurilor utiliznd structuri de adiacene implementate cu ajutorul structurilor multilist} type TipCheie TipInfo = .....; = .....;
TipElement = record cheie: TipCheie; info : TipInfo end; RefTipAdj TipAdj = ^TipAdj;
= record cheieAdj: TipCheie; urmAdj : RefTipAdj end; RefTipNod = ^TipNod; TipGraf = RefTipNod; TipNod = record elem : TipElement; urmNod : RefTipNod; incepAdj: RefTipAdj [10.3.2.2.a] end; TipArc = record v1,v2: RefTipNod end; var g: TipGraf; indicNod: RefTipNod; indicArc: TipArc; k,k1,k2: TipCheie; e: TipElement; ------------------------------------------------------------ Se face precizarea c valorile aferente nodurilor sunt pstrate integral n lista de noduri, n lista de arce aprnd numai cheile.
Este posibil ca cmpul info s lipseasc i deci TipElement=TipCheie. n figura 10.3.2.2.a apare reprezentarea schematic a unei structuri de adiacene cu
precizarea cmpurilor aferente.
Inseria unui nod nou se realizeaz simplu la nceputul listei nodurilor. Operatorul InserArc(g:
TipGraf; ,k1, k2 : TipCheie) presupune inseria lui k1 n lista de adiacene a lui k2 i reciproc.
i n acest caz inseria se realizeaz cel mai simplu la nceputul listei. Suprimarea unui arc precizat spre exemplu de indicatorul indicArc
presupune extragerea a dou noduri din dou liste de adiacene diferite.
Procedura care realizeaz suprimarea n aceast manier a unui arc apare n secvena
[10.3.2.2.b]
n acest scop, se determin cheia k1 a nodului de suprimat. n continuare, att timp ct mai exist elemente n lista sa de adiacente se
realizeaz urmtoarea secven de operaii:
n final se suprim nodul k1 din lista nodurilor grafului. Procedura care realizeaz suprimarea unui nod apare n secvena [10.3.2.2.c]
-----------------------------------------------------------{Suprimarea unui nod. n implementare se utilizeaz operatorii definii pentru TDA List nlanuit simpl} procedure SuprimNod(g: TipGraf; indicNod: RefTipNod); var k1,k2 : TipCheie; indicNod2 : REfTipNod; ik1,curent: PtrAdj;
[10.3.2.2.c]
begin k1:= indicNod^.elem.cheie; curent:= indicNod^.incepAdj; WHILE not Fin(curent) do begin k2:= (Primul(curent))^.cheieAdj; Suprima(Primul(curent),curent); {Se presupune ca operatorul Suprima actualizeaz n mod corespunzator valoarea variabilei "curent" nemaifiind necesar trecerea explicit la elementul urmator al listei indicate de "curent". Se precizeaz faptul ca n aceast situaie este vorba despre o suprimare a primului element al listei} indicNod2 := Cauta(k2,g); ik1:= Cauta(k1,indicNod2^.incepAdj); Suprima(ik1,indicNod2^.incepAdj); end Suprima(indicNod,g) end; {SuprimNod} ------------------------------------------------------------
Fig.10.3.2.2.c. Structur de adiacene dup suprimarea unui nod (d). 10.4. Tehnici fundamentale de traversare a grafurilor
n acest scop s-au dezvoltat dou tehnici fundamentale, una bazat pe cutarea n
adncime, cealalt bazat pe cutarea prin cuprindere. 10.4.1. Traversarea grafurilor prin tehnica cutrii n adncime (DepthFirst Search)
Cutarea n adncime este una dintre tehnicile fundamentale de traversare a grafurilor. Aceast tehnic este similar traversrii n preordine a arborilor i ea constituie nucleul
n jurul cruia pot fi dezvoltai numeroi algoritmi eficieni de prelucrare a grafurilor.
Principiul cutrii n adncime ntr-un graf G este urmtorul: Se marcheaz iniial toate nodurile grafului G cu marca nevizitat. Cutarea debuteaz cu selecia unui nod n a lui G pe post de nod de pornire i
cu marcarea acestuia cu vizitat.
n continuare, fiecare nod nevizitat adiacent lui n este cutat la rndul su,
aplicnd n mod recursiv aceeai cutare n adncime.
Dac n graf au rmas noduri nevizitate, se selecteaz unul dintre ele drept nod
nou de pornire i procesul se repet pn cnd toate nodurile grafului au fost vizitate.
Fie y nodul corespunztor acestui arc. Dac nodul y a fost deja vizitat, se caut un alt arc neexplorat conectat la x. Dac y nu a fost vizitat anterior, el este marcat vizitat i se iniiaz o
nou cutare ncepnd cu nodul y.
Din aceste motive traversarea grafurilor este cunoscut i sub denumirea de "colorare
a grafurilor".
Toate nodurile sunt iniial colorate n alb, n timpul traversrii devin gri iar la
terminarea traversrii sunt colorate n negru.
Un nod alb care este descoperit prima dat n traversare este colorat. n consecin, nodurile gri i negre au fost deja ntlnite n procesul de
traversare, ele marcnd modul n care avanseaz traversarea.
Un nod este colorat n negru cnd toate nodurile adiacente lui au fost
descoperite.
Un nod colorat n gri poate avea i noduri adiacente albe. Nodurile gri marcheaz frontiera ntre nodurile descoperite i cele
nedescoperite i ele se pstreaz de regul n structura de date asociat procesului de traversare.
Acest subgraf este un graf conex aciclic, adic un arbore, care poate fi simplu
reprezentat prin tehnica "indicator spre printe".
Tehnica de construcie a subgrafului este urmtoarea: Atunci cnd n procesul de cutare se ajunge de la nodul u la nodul v,
acest lucru se marcheaz n subgraful asociat s prin s[v]=u.
Analiza algoritmului. Liniile 1-3 i 5-7 ale lui TraversareInAdncime necesit un timp
proporional cu O(N), excluznd timpul necesar execuiei apelurilor procedurii de cutare propriu-zise.
| Adj [ v ] |= O( a )
[10.4.1.1.c]
------------------------------------------------------------
Tabloul marc este poziionat iniial pe zero, astfel nct marc[x]=0 indic
faptul c nodul x nu a fost nc vizitat.
end; {CautaInAdincime} begin { Traversare1 } id:= 0; for x:= 1 to N do marc[x]:= 0; for x:= 1 to N do if marc[x] = 0 then begin CautaInAdincime(x); writeln end end; { Travesare1 } ------------------------------------------------------------
Vizitarea unui nod presupune parcurgerea tuturor arcelor conexe lui, adic
parcurgerea listei sale de adiacene i verificarea pentru fiecare arc n parte, dac el conduce la un nod care a fost sau nu vizitat.
n caz c nodul este nevizitat procedura se apeleaz recursiv pentru acel nod. Procedura Traversare1, parcurge tabloul marc i apeleaz procedura de
CautaInAdancime pentru componentele nevizitate ale grafului, pn la traversarea sa integral.
Structura de adiacene aferent grafului apare n aceeai figur (b) Evoluia coninutului stivei apare n n aceeai figur (c). Se menioneaz faptul c nodurile structurii de adiacene au ataat un
exponent fracionar care la numrtor precizeaz momentul la care este descoperit nodul, (adic momentul n care este introdus n stiv), iar la numitor, momentul terminrii explorrii nodului, (adic momentul n care este scos din stiv).
Ca atare nodul A este introdus n stiv la momentul 1. Pentru nodul A se parcurge lista sa de adiacene, primul arc traversat fiind AF,
deoarece F este primul nod din lista de adicene a lui A.
Nodul E se introduce n stiv la momentul 3. Se traverseaz n continuare arcul EG (G se introduce n stiv la momentul 4)
G fiind primul nod din lista de adiacene a lui E.
Se revine n lista de adiacene a lui E. Deoarece D a fost ultimul nod din lista
de adiacene a lui E, vizita lui E se ncheie la momentul 8 i revine n nodul F a crui vizitare se ncheie prin parcurgerea arcului FD (D deja vizitat).
1/14 12/13
2/
10/
C 12/ B G
A B D F (a) C
BA CA
DFE E 4/ G F 6/ D F A 3/ E D
GEA
(b)
G E F A 1 A A 2 F F A 3 E E F A 4 G E F A 5
D E F A 6 D E F A 7 (c) F A 8 A 9 C A 10 C A 11 B A 12 B A 13 14
A B D F C
K (a)
M (b)
n figura 10.4.2.1.b: O linie continu indic faptul c nodul aflat la extremitatea sa inferioar, a
fost gsit n procesul de cutare n lista de adiacene a nodului aflat la
extremitatea sa superioar i nefiind vizitat la momentul considerat, s-a realizat pentru el un apel recursiv al procedurii de cutare.
materializeaz arcele grafului, mulimea (pdurea) arborilor de cutare n adncime asociai unui graf reprezint o alt metod de reprezentare grafic a grafului.
n orice moment al execuiei algoritmului, nodurile grafului se mpart n trei clase: (1) Clasa I - conine nodurile pentru care procesul de vizitare s-a terminat
(colorate n negru)
(2) Clasa II - conine nodurile care sunt n curs de vizitare (colorate n gri) (3) Clasa III - conine nodurile la care nu s-a ajuns nc (colorate n alb). (1) n ceea ce privete prima clas de noduri, datorit modului de implementare a
procedurii de cutare, nu va mai fi selectat nici un arc care indic vreun astfel de nod, motiv pentru care aceste arce nu se reprezint n structura de arbore.
(2) n ceea ce privete clasa a III-a de noduri, aceasta cuprinde nodurile pentru care se
vor realiza apeluri recursive i arcurile care conduc la ele vor fi marcate cu linie continu n arbore.
(3) Mai rmn nodurile din cea de-a doua clas: acestea sunt nodurile care au aprut
cu siguran n drumul de la nodul curent la rdcina arborelui, sunt colorate n gri i sunt memorate n stiva asociat cutarii.
Ca atare, orice arc procesat care indic vreunul din aceste noduri apare reprezentat
punctat n arborele de cutare n adncime.
n concluzie: Arcele marcate continuu n figura 10.4.1.2.b se numesc arce de arbore Arcele marcate punctat se numesc arce de retur. Din punct de vedere formal, dac x i y sunt noduri ale grafului ce urmeaz a fi
traversat atunci:
(1) Arcul de arbore este acel arc (x,y) al grafului pentru care instana de apel a
procedurii recursive CautInAdncime(x) CautInAdncime(y). apeleaz instana
(2) Arcul de retur (x,y) este un arc al grafului ntlnit n procesul de vizitare al
nodului x, adic ntlnit n lista lui de adiacene i care conduce la un nod y aparinnd clasei I sau II,
Ca i n cazul anterior, selecia unui arc care conduce la un nod nevizitat este
urmat de un apel recursiv al procedurii de cutare pentru nodul respectiv.
-----------------------------------------------------------{Cutare "n adncime" n grafuri reprezentate prin matrici de adiacene} procedure CautaInAdincime1(x: integer); var t: integer; begin id:= id + 1; marc[x]:= id;
write(x); [10.4.1.3.a] for t:= 1 to N do if A[x,t] then if marc[t] = 0 then CautaInAdincime1(t) end; { CautaInAdincime1 } ------------------------------------------------------------
Pentru graful din figura 10.4.1.3.a (a), a crui matrice de adiacene apare n aceeai
figur (b), evoluia stivei asociate traversrii apare n (c) i (d) iar arborii de cutare n adncime corespunztori apar n fig. 10.4.1.3.b.
A B D F C
A B C D E F G H I J K L M
A 0 1 1 0 0 1 1
BCD 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
K (a)
M G E D D F A 8 E E D F A 9 G E D F A 10 D F A 11
(b)
B A 1 A A 2 B A 3
C A 4 C A 5
F A 6 F K
F A 7 D (c)
F A 12 A 13 14
I H 15 H H 16 I H 17
J H 18 J
J H 19 K
J H 20 H 21 (d) L 22
M L 23 L L 24 M 25 26
A B C F I
Fig.10.4.1.3.b. Pdure de arbori de cutare n adncime n grafuri reprezentate prin matrice de adiacene
Acest lucru este evident ntruct n procesul de traversare este verificat fiecare
element al matricei de adiacene.
Cutarea n adncime rezolv unele probleme fundamentale ale prelucrrii grafurilor. Astfel, deoarece procedura de parcurgere a unui graf se bazeaz pe traversarea
pe rnd a componentelor sale conexe, numrul componentelor conexe ale unui graf poate fi determinat simplu contoriznd numrul de apeluri ale procedurii CautInAdncime efectuat din ultima linie a procedurii Traversare1.
Aceast nseamn c se parcurge un arc care conduce la un nod care a mai fost
vizitat, deci graful conine un ciclu.