Sunteți pe pagina 1din 31

12.

Grafuri orientate
Dup cum s-a mai precizat, grafurile orientate sunt grafuri n care arcele care
conecteaz nodurile au un singur sens.

Aceast restricie face mult mai dificil evidenierea i exploatarea diverselor


proprieti ale grafurilor de acest tip.

Prelucrarea unui astfel de graf este identic cu o cltorie cu maina ntr-un ora
cu foarte multe strzi cu sens unic sau cu o cltorie cu avionul ntr-o ar n care liniile aeriene nu sunt dus-ntors.

n astfel de situaii a ajunge dintr-un loc n altul poate reprezenta o adevrat


problem.

De multe ori arcele orientate reflect anumite tipuri de relaii de preceden n aplicaia
pe care o modeleaz.

Spre exemplu un graf orientat poate fi utilizat ca model pentru o linie de


fabricaie:

Nodurile corespund diverselor operaii care trebuiesc executate Un arc de la nodul x la nodul y precizeaz faptul c operaiunea
corespunztoare nodului x trebuie executat naintea celei corespunztoare nodului y.

n acest context, problema care se pune este aceea de a executa toate aceste
operaii, fr a eluda niciuna dintre relaiile de preceden impuse.

Dup cum s-a menionat n capitolul 10, reprezentrile grafurilor orientate sunt
simple extensii (de fapt restricii) ale reprezentrilor grafurilor neorientate. Astfel:

n reprezentarea bazat pe liste de adiacene, fiecare arc apare o singur dat:


arcul de la nodul x la y este reprezentat prin prezena nodului y n lista de adiacene a lui x.

n reprezentarea bazat pe matrice de adiacene, arcul de la nodul x la y se


marcheaz tot o singur dat, prin valoarea "adevrat" a elementului matricii de adiacene situat n linia x, coloana y (nu i a elementului situat n linia y, coloana x).

n figura 12.1.a apare un exemplu de graf orientat

Graful const din arcele AG,AB,CA,LM,JM,JL,JK,ED,DF,NI,FE,AF,


GE,GC,HG,GJ,LG,IH, ML.

Ordinea n care nodurile apar la specificarea arcelor este semnificativ Notaia AG preciznd un arc care i are sursa n nodul A i destinaia
n nodul G.

Este ns posibil ca ntre dou noduri s existe dou arce avnd sensuri opuse
(exemplu HI i IH, respectiv LM i ML).

C J D E L M K

Fig.12.1.a. Exemplu de graf orientat.

Pornind de la aceast precizare este uor de observat faptul c un graf neorientat


poate fi asimilat cu graful orientat identic ca i structur, care conine pentru fiecare arc al grafului neorientat dou arce opuse.

n acest context unii dintre algoritmii dezvoltai n acest capitol, pot fi


considerai generalizri ale algoritmilor din capitolele anterioare.

n cadrul acestui capitol vor fi prezentate unele dintre problemele specifice acestei
categorii de grafuri precum i o serie de algoritmi consacrai care le soluioneaz.

Este vorba despre: (1) Problema drumurilor minime cu origine unic (2) Problema drumurilor minime corespunztoare tuturor perechilor de noduri (3) nchiderea tranzitiv (4) Grafuri orientate aciclice (5) Componente conectate n grafuri orientate

12.1. Problema drumurilor minime cu origine unic ("SingleSource Shortest Path Problem")

O prim problem care se abordeaz n contextul grafurilor orientate este urmtoarea: Se consider un graf orientat G=(N,A) n care fiecare arc are o pondere
pozitiv i pentru care se precizeaz un nod pe post de origine.

Se cere s se determine costul celui mai scurt drum de la origine la oricare alt
nod al grafului

Conform celor deja precizate, costul unui drum este suma ponderilor
arcelor care formeaz drumul.

Aceast problem este cunoscut sub numele de problema drumurilor


minime cu origine unic (single source shortest path problem).

Desigur o abordare mai natural, ar fi aceea care-i propune s determine cel mai
scurt drum de la o origine la o destinaie precizat.

Aceast problem are acelai grad de dificultate ca i problema anterioar care


de fapt o generalizeaz.

Astfel, pentru a rezolva aceast ultim problem, este suficient ca execuia


algoritmului care determin drumurile minime cu origine unic s fie oprit n momentul n care se ajunge la destinaia precizat.

Exact ca i n cazul grafurilor ponderate neorientate, ponderea poate avea semnificaia


fizic a unui cost, a unei valori, a unei lungimi, a unui timp, etc.

Intuitiv, graful G poate fi asimilat cu o hart a traseelor aeriene ale unui stat n care: Fiecare nod reprezint un ora Fiecare arc (x,y) reprezint o legtur aerian de la oraul x la oraul y. Ponderea unui arc (x,y) poate fi timpul de zbor sau preul biletului. Desigur, ca model ar putea fi utilizat i un graf neorientat deoarece ponderea arcului
(x,y) trebuie s fie n principiu aceeai cu cea a arcului (y,x).

n realitate pe de o parte nu toate traseele aeriene sunt dus-ntors, iar pe de alt


parte dac ele sunt dus-ntors, timpul de zbor s-ar putea s difere n cele dou sensuri.

n orice caz, considernd arcele (x,y) i (y,x) cu ponderi identice, aceasta


nu conduce la o simplificare a rezolvrii problemei.

12.1.1. Algoritmul lui Dijkstra

Pentru a rezolva problema drumurilor minime cu origine unic, o manier clasic de


abordare o reprezint utilizarea unui algoritm bazat pe tehnica greedy adesea cunoscut sub denumirea de algoritmul lui Dijkstra

Acest algoritm a fost publicat de ctre E.W. Dijkstra n anul 1959. Algoritmul se bazeaz pe o structur de date mulime M care conine nodurile
pentru care cea mai scurt distan la nodul origine este deja cunoscut.

Iniial M conine numai nodul origine. n fiecare pas al execuiei algoritmului, se adaug mulimii M un nod x care nu
aparine nc mulimii i a crui distan de la origine este ct mai scurt posibil.

Presupunnd c toate arcele au ponderi pozitive, ntotdeauna se poate gsi un


drum minim care leag originea de nodul x, drum care trece numai prin nodurile coninute de M.

Un astfel de drum se numete drum special. Pentru nregistrarea lungimii drumurilor speciale corespunztoare nodurilor
grafului se utilizeaz un tablou D care este actualizat n fiecare pas al algoritmului.

n momentul n care M include toate nodurile grafului, toate drumurile sunt


speciale i n conscin, tabloul D memoreaz cea mai scurt distan de la origine la fiecare nod al grafului.

Schia de principiu a algoritmului lui Dijkstra apare n secvena [12.1.1.a].


-----------------------------------------------------------PROCEDURE Dijkstra; {Determin costurile celor mai scurte drumuri care conecteaz nodul 1, considerat drept origine, cu toate celelalte noduri ale unui graf orientat} BEGIN [1] M:= [1]; {nodul origine} [2] FOR i:= 2 TO n DO {iniilizarea lui D} [3] D[i]:= COST[1,i]; [12.1.1.a] [4] FOR i:= 1 TO n-1 DO BEGIN [5] *alege un nod x aparinnd mulimii N - M astfel nct D[x] s fie minim; [6] *adaug pe x lui M; [7] FOR fiecare nod y din N - M DO [8] D[y]:= min(D[y],D[x] + COST[x,y]) END END; {Dijkstra} ------------------------------------------------------------

Referitor la algoritmul lui Dijkstra, se presupune c: Se d un graf orientat G= (N,A) unde N={1,2,3,,n}

Nodul 1 este considerat drept origine. COST este un tablou cu dou dimensiuni unde COST[i,j] reprezint costul
deplasrii de la nodul i la nodul j pe arcul (i,j).

Dac arcul (i,j) nu exist, se presupune c C[i,j] este , respectiv


are o valoare mai mare dect orice cost.

La fiecare iteraie a algoritmului, tabloul D[i] conine lungimea drumului special


minim curent de la origine la nodul i.

Pentru exemplificare, se prezint execuia algoritmului lui Dijkstra pentru graful


orientat din figura 12.1.1.a.

1 10 30 2 50 3 10 20 4 5 60 100

Fig.12.1.1.a. Graf orientat ponderat

Iniial M={1}, D[2]=10,D[3]=, D[4]=30 i D[5]=100. n prima iteraie a buclei FOR din liniile [4][8], se selecteaz x=2 ca fiind
nodul de distan minim din D.

n continuare se face D[3]=min(,10+50)=60. D[4] i D[5] nu se modific deoarece n ambele cazuri, drumul
direct care conecteaz nodurile respective cu originea este mai scurt dect drumul care trece prin nodul 2.

n continuare, modul n care se modific tabloul D dup fiecare iteraie a


buclei FOR mai sus precizate apare n figura 12.1.1.b.

Iteratia Initial (1) (2) (3) (4)

M {1} {1,2} {1,2,4} {1,2,4,3} {1,2,4,3,5}

x 2 4 3 5

D[2] 10 10 10 10 10

D[3] 60 50 50 50

D[4] 30 30 30 30 30

D[5] 100 100 90 60 60

1 x Parinte[x] 1 0 2 1 3 4 4 1 5 3 2 4

Fig.12.1.1.b. Determinarea drumurilor minime cu origine unic n baza algoritmului lui Dijkstra

n vederea reconstruciei drumurilor minime de la origine la fiecare nod al grafului, se


utilizeaz un alt tablou Printe

n acest tablou, Printe[x] memoreaz nodul care precede nodul x n cadrul


drumului minim, adic memoreaz tatl nodului x.

Tabloul Printe se iniializeaz cu Printe[i]=1 pentru toate valorile lui


i1.

Tabloul Printe poate fi actualizat dup linia [8] n procedura Dijkstra


din secvena [12.1.1.a].

Astfel, dac n linia [8], D[x]+COST[x,y]<D[y], atunci se face


Printe[y]:=x.

Dup terminarea procedurii, drumul la fiecare nod poate fi reconstituit n sens invers
mergnd pe nlnuirile indicate de tabloul Printe.

Astfel, pentru graful orientat din fig. 12.1.1.a, tabloul Printe conine valorile
precizate n figura 12.1.1.b.

Pentru a gsi spre exemplu, drumul minim de la nodul 1 la nodul 5 al grafului,


se determin predecesorii (prinii) n ordine invers ncepnd cu nodul 5.

Astfel se determin 3 ca predecesorul lui 5, 4 ca predecesor al lui 3, 1 ca


predecesor al lui 4.

n consecin drumul cel mai scurt de la nodul 1 la nodul 5 este 1,4,3,5 iar
lungimea sa 60 este memorat n D[5].

n aceeai figur apare reprezentat i arborele de acoperire corespunztor drumurilor

minime cu origine unic ataat grafului din figura 12.1.1.a.

12.1.3. Analiza performanei algoritmului lui Dijkstra

Se presupune c algoritmul din secvena [12.1.1.a], opereaz asupra unui graf orientat
cu n noduri i a arce.

Dac pentru reprezentarea grafului se utilizeaz o matrice de adiacene, atunci bucla


FOR din liniile [7]-[8] necesit un efort de calcul proporional cu O(n).

ntruct aceast bucl este executat de n-1 ori, (bucla FOR din linia [4]),
timpul total de execuie va fi proporional cu O(n2).

Este uor de observat c restul algoritmului nu necesit timpi superiori acestei


valori.

(2) Dac a este mult mai mic dect n2, este mai indicat ca n reprezentarea grafului s
se utilizeze liste de adiacene, respectiv o coad bazat pe prioritate implementat ca un ansamblu (arbore binar parial ordonat), pentru a pstra distanele la nodurile mulimii N-M.

n aceste condiii, bucla din liniile [7]-[8] poate fi implementat ca i o


traversare a listei de adiacene a lui x cu actualizarea distanelor nodurilor din coada bazat pe prioritate.

n total, pe ntreaga durat a execuiei procedurii, se vor realiza a actualizrii,


fiecare cu un efort proporional cu O(log n), astfel nct timpul total consumat n liniile [7]-[8] va fi proporional cu O(a log n) i nu cu O(n2).

n mod evident liniile [2]-[3] necesit asemeni liniilor [4]-[6] un efort


de calcul proporional cu O(n).

Utiliznd n reprezentarea mulimii N-M o coad bazat pe prioriti, linia


[5] implementeaz operaia de extragere a elementului cu prioritatea minim din coad, fiecare din cele n-1 iteraii ale acestei linii necesitnd O(log n) uniti de timp.

n consecin, timpul total consumat de aceast variant a algoritmului lui


Dijkstra este limitat la O(a log n) (an-1), performa care este considerabil mai bun dect O(n2).

Se reamintete faptul c aceast performan se poate obine numai dac a


este mult mai mic n raport cu n2.

12.2 Problema drumurilor minime corespunztoare tuturor perechilor de noduri ("All-Pairs Shortest Path Problem")

Se presupune c exist un graf orientat ponderat coninnd timpii de zbor pentru anumite
trasee aeriene care conecteaz orae i c se dorete construcia unei tabele care furnizeaz cei mai scuri timpi de zbor ntre oricare dou orae.

Aceasta este o instan a problemei drumurilor minime corespunztoare


tuturor perechilor de noduri (all-pairs shortest paths problem).

Pentru a formula problema n termeni formali, se presupune c se d un graf orientat


G=(N,A), n care fiecare arc (x,y) are o pondere pozitiv COST[x,y].

Rezolvarea problemei drumurilor minime corespunztoare tuturor perechilor de


noduri pentru graful G, presupune determinarea pentru fiecare pereche ordonat de noduri (x,y),unde x,y N, a lungimii drumului minim care conecteaz nodul x cu nodul y.

Aceast problem poate fi rezolvat cu ajutorul algoritmului lui Dijkstra, considernd pe


rnd, fiecare nod al grafului G drept origine.

De fapt rezultatul execuiei algoritmului lui Dijkstra este un tablou care conine
distana de la origine la restul nodurilor grafului.

n cazul de fa, deoarece este necesar determinarea distanelor pentru toate


perechile de noduri, avem nevoie de o matrice de elemente n care fiecare rnd se poate determina n baza algoritmului lui Dijkstra.

rezolvare mai direct a problemei drumurilor minime corespunztoare tuturor perechilor


de noduri ale unui graf, este datorat algoritmului lui R.W. Floyd datnd din anul 1962. 12.2.1. Algoritmul lui Floyd

Fie graful ponderat G=(N,A)are are ataat matricea de ponderi COST. Pentru convenien, se consider c nodurile mulimii N sunt numerotate de la
1 la n.

Algoritmul lui Floyd utilizeaz o matrice A de dimensiuni nXn cu ajutorul creia


determin lungimile drumurilor minime.

Iniial se face A[i,j]=COST[i,j] pentru toi i j. Dac nu exist niciun arc de la nodul i la nodul j, se presupune c
COST[i,j]= .

Elementele diagonalei matricei A se pun toate pe 0. Algoritmul lui Floyd execut n iteraii asupra matricii A. Dup cea de-a k-a iteraie, A[i,j] va conine lungimea minim a unui drum
de la nodul i la nodul j, care nu trece prin nici un nod cu numr mai mare ca i k.

Cu alte cuvinte, i i j pot fi oricare dou noduri ale grafului care delimiteaz
nceputul i sfritul drumului, dar orice nod intermediar care intr n alctuirea drumului trebuie s aib numrul mai mic sau cel mult egal cu k.

n cea de-a k iteraie se utilizeaz urmtoarea formul n calculul lui A


(formula [12.2.1.a]): ----------------------------------------------------------- Ak 1 [ i , j ] Ak [ i , j ] = min Ak 1 [ i , k ] + Ak 1 [ k , j ] [12.2.1.a]

------------------------------------------------------------------------

Se face precizarea c indicele k semnific momentul de timp la care se


realizeaz calculul matricei A (n cadrul celei de-a k iteraii) i nu faptul c ar exista n matrici A, fiind utilizat pentru o nelegere mai facil a funcionrii algoritmului.

Formula de mai sus are interpretarea simpl precizat n figura 12.2.1.a.

k Ak-1[ i,k ] Ak-1[ k,j ]

i Ak-1[ i,j ]

Fig.12.2.1.a. Selecia drumului minim de la nodul i la nodul j la momentul k

Pentru calculul lui Ak[i,j] se compar Ak-1[i,j] - adic costul drumului


de la i la j fr a trece prin nodul k sau oricare alt nod cu numr mai mare ca i k, cu Ak-1[i,k]+Ak-1[k,j] - adic costul drumului de la i la k nsumat cu costul drumului de la k la j fr a trece prin nici un nod cu numr mai mare ca i k.

Dac drumul din urm se dovedete a fi mai scurt, atunci el este atribuit
valorii Ak[i,j], altfel aceasta rmne identic cu valoarea anterioar.

Pentru graful ponderat din figura 12.2.1.b. (a), se prezint n cadrul aceleiai figuri
modul n care se modific matricea A pornind de la coninutul ei iniial A0 i terminnd cu coninutul su final A3.

2 1 1 3 8 2 3

1 0 3

2 8 0 2 A0

3 5 0 1 2 3

1 0 3

2 8 0 2 A1

3 5 8 0

2 5 1 1 2 3 3 0 3 5 2 8 0 2 A2 3 5 8 0 1 2 3 1 0 3 5 2 7 0 2 A3 3 5 0

(a)

(b)

Fig.12.2.1.b. Calculul lungimii drumurilor minime corespunztoare tuturor perechilor de noduri ale unui graf utiliznd algoritmul lui Floyd

Deoarece Ak[i,k]=Ak-1[i,k] i Ak[k,j]=Ak-1[k,j], nici o intrare a


matricii A n care intervine pe post de indice valoarea k, nu se modific n timpul celei de-a k-a iteraii.

Cu alte cuvinte, matricea A este invariant n raport cu indicele k. n consecin se poate utiliza o singur copie a matricii A. Structura de principiu a procedurii care implementeaz algoritmul lui Floyd n baza
considerentelor mai sus enunate apare n secvena [12.2.1.a]. -----------------------------------------------------------PROCEDURE Floyd(VAR A: ARRAY[1..n,1..n] OF real; COST: ARRAY[1..n,1..n] OF real); {Procedura determin matricea drumurilor minime A pornind de la matricea ponderilor COST} VAR i,j k: INTEGER; BEGIN [1] FOR i:= 1 TO n DO [2] FOR j:= 1 TO n DO [3] A[i,j]:= COST[i,j]; [12.2.1.a] [4] FOR i:= 1 TO n DO [5] A[i,i]:= 0; [6] FOR k:= 1 TO n DO [7] FOR i:= 1 TO n DO [8] FOR j:= 1 TO n DO [9] IF A[i,k] + A[k,j] < A[i,j] THEN [10] A[i,j]:= A[i,k] + A[k,j] END; {Floyd} ------------------------------------------------------------

Timpul de execuie al acestei proceduri este n mod clar proporional cu O(n3)


deoarece la baza sa st o bucl tripl ncuibat.

Verificarea corectitudinii funcionrii algoritmului se poate realiza simplu prin


metoda induciei.

Astfel este uor de demonstrat c dup ce k trece prin bucla tripl FOR,
A[i,j] memoreaz lungimea celui mai scurt drum de la nodul i la nodul j care n niciun caz nu trece printr-un nod cu numr mai mare ca i k [AH85]. 12.2.2. Comparaie ntre algoritmul lui Floyd i algoritmul lui Dijkstra

Pentru grafuri reprezentate prin matrici de adiacene: (1) Versiunea algoritmului Dijkstra determin drumurile minime specifice
unui nod precizat cu performana O(n2),

(2) Algoritmul lui Floyd determin toate drumurile minime cu performana


O(n3).

Constantele de proporionalitate reale depind de natura compilatorului,


de sistemul de calcul i de implementarea propriu-zis.

De fapt activitatea experimental i msurtorile reale reprezint cele


mai bune criterii de apreciere a performanelor unui algoritm.

n condiiile n care numrul de arce a este mult mai redus dect n2 i drept
consecin grafurile sunt reprezentate prin liste de adiacene:

(1) Algoritmul lui Floyd i pstreaz performana stabilit O(n3), (2) Este de ateptat ca algoritmul lui Dijkstra s se comporte mai bine. Astfel dup cum s-a precizat, acest algoritm determin drumurile
minime corespunztoare unui nod precizat (origine) cu un efort de calcul proporional cu O(a log n).

n consecin utiliznd aceast variant de algoritm, problema


drumurilor minime corespunztoare tuturor perechilor de noduri se poate rezolva aplicnd algoritmul lui Dijkstra tuturor nodurilor grafului cu performana O(na log n).

Se face din nou precizarea c aceast performan se poate obine


atunci cnd a<<n2 respectiv dimensiuni. n cazul grafurilor rare de mari

12.2.3. Determinarea traseelor drumurilor minime

Algoritmii dezvoltai n cadrul acestui paragraf determin de fapt costurile drumurilor


minime.

De multe ori, n practic este ns foarte util a se cunoate i traseul acestor drumuri
minime.

Pentru a rezolva aceast problem, n contextul algoritmului lui Floyd este necesar
utilizarea unei alte matrici Drum

n matricea Drum, o locaie Drum[i,j] memoreaz acel nod k care conduce


n cadrul algoritmului la cea mai mic valoare pentru A[i,j].

Dac Drum[i,j]=0 atunci cel mai scurt drum este cel direct de la nodul i la
nodul j.

Varianta modificat a algoritmului lui Floyd care determin i matricea Drum apare n
secvena [12.2.3.a]. -----------------------------------------------------------PROCEDURE Floyd1(VAR A: ARRAY[1..n,1..n] OF real COST: ARRAY[1..n,1..n] OF real VAR Drum: ARRAY[1..n,1..n] OF integer); {Procedura primete matricea COST i determin matricea A care memoreaz lungimile drumurilor minime i matricea Drum care memoreaz nodul intermediar al fiecrui drum de la i la j(dac exist)} VAR i,j,k: integer; BEGIN [1] FOR i:= 1 TO n DO [2] FOR j:= 1 TO n DO BEGIN [3] A[i,j]:= C[i,j]; [12.2.3.a] [4] Drum[i,j] := 0 END; [5] FOR i:= 1 TO n DO [6] A[i,i]:= 0; [7] FOR k:= 1 TO n DO [8] FOR i:= 1 TO n DO [9] FOR j:= 1 TO n DO [10] IF A[i,k] + A[k,j] < A[i,j] THEN BEGIN [11] A[i,j]:= A[i,k] + A[k,j]; [12] Drum[i,j]:= k END END; {Floyd1} ------------------------------------------------------------

Matricea Drum este de fapt o colecie de arbori corespunztori drumurilor minime, cte
unul pentru fiecare nod al grafului original.

Afiarea traseului drumului minim de la nodul i la nodul j, prin evidenierea


nodurilor intermediare se poate realiza cu ajutorul procedurii Traseu (secvena [12.2.3.b]). -----------------------------------------------------------PROCEDURE Traseu(i,j: integer); {Afieaza traseul drumului minim de la nodul i la nodul j} VAR k: integer; BEGIN [12.2.3.b] k:= Drum[i,j]; IF k <> 0 THEN BEGIN Traseu(i,k); writeln(k); Traseu(k,j) END END; {Traseu} ------------------------------------------------------------

Procedura Traseu aplicat unei matrici oarecare ar putea cicla la infinit. Acest lucru nu se ntmpl n situaia n care ea este aplicat matricii Drum,
deoarece este imposibil ca un nod oarecare k s apar n drumul minim de la nodul i la nodul j i n acelai timp j s apar n drumul minim de la i la k.

Se reamintete din nou importana crucial a valorilor pozitive a ponderilor


arcelor grafului.

n figura 12.2.3.a apare coninutul final al matricii Drum pentru graful orientat din
figura 12.2.1.b. (a).

1 1 2 3 0 0 2

2 3 0 0

3 0 1 0

matricea Drum

Fig.12.2.3.a. Matricea traseelor drumurilor minime corespunztoare grafului din figura 12.2.1.b. (a). 12.2.4. Aplicaie. Determinarea centrului unui graf orientat ponderat

Se presupune c se d graful orientat ponderat G=(N,A) i se cere s se determine


cel mai central nod al su adic centrul grafului.

Pentru a defini termenul de cel mai central nod se definete pentru nceput
noiunea de excentricitate a unui nod aparinnd unui graf ponderat.

Excentricitatea unui nod xN este precizat de formula [12.2.4.a]:


-----------------------------------------------------------Excentricitate[x]= max{drumurile minime de la x la y} xN yN [12.2.4.a] ------------------------------------------------------------

Cu alte cuvinte, excentricitatea unui nod al unui graf ponderat este valoarea maxim
dintre lungimile drumurilor minime de la nodul respectiv la toate celelalte noduri ale grafului.

Centrul unui graf G este nodul a crui excentricitate este minim. Spre exemplu pentru graful din figura 12.2.4.a. (a), valorile excentricitilor
nodurilor apar n tabloul (c) din aceeai figur.

Conform definiiei anterioare, centrul grafului G este nodul d. Utiliznd algoritmul lui Floyd, determinarea centrului unui graf G se poate realiza
simplu.

Presupunnd c COST este matricea ponderilor arcelor gafului, se procedeaz astfel. (1) Se determin cu ajutorul procedurii Floyd matricea drumurilor minime
corespunztoare tuturor perechilor de noduri (fig.12.2.4.a. (b)).

(2) Se determin excentricitile nodurilor i,(1iN) gsind valoarea


maxim de pe fiecare coloan i a matricei.

(3) Se caut nodul cu excentricitatea minim. Acesta este centrul grafului G. n figura 12.2.4.a. (b) apare matricea valorilor drumurilor minime pentru graful din
aceeai figur (a).

Determinarea nodului central al grafului este evident.


a 1 a b 2 c 4 e (a) 3 5 2 1 d a b c d e max 0 b 1 0 3 1 6 6 c 3 2 0 3 8 8 (b) d 5 4 2 0 5 5 e 7 6 4 7 0 7 (c) nod excentricitate a b c d e 6 8 5 7

Fig.12.2.4.a. Determinarea centrului unui graf ponderat

12.3. nchiderea tranzitiv n grafurile neorientate, nodurile la care se poate ajunge pornind de la un nod precizat,
cu alte cuvinte conexiunile unui nod la grafului, pot fi determinate simplu aplicnd proprietile de conectivitate ale grafurilor.

Pur i simplu, toate nodurile la care se poate ajunge n procesul de cutare


aparin unei aceleiai componente conexe a grafului.

Aceast observaie este valabil n principiu i n cazul grafurilor orientate cu precizarea


ns c n aceast situaie rezolvarea este mai complex i ea nu poate fi redus la simpla determinare a componentelor conexe.

O modalitate de a rezolva problemele de conectivitate n cazul grafurilor orientate


este urmtoarea.

Se completeaz graful iniial cu arce pe baza urmtoarei metode: dac n


graful iniial se poate ajunge ntr-un mod oarecare de la nodul x la nodul y parcurgnd arcele orientate ale grafului, atunci se adaug grafului arcul (x,y).

Graful care se obine adugnd toate arcele de aceast natur se numete nchiderea
tranzitiv a grafului iniial.

Deoarece este de ateptat s fie adugate un numr mare de arce, deci graful
obinut s fie dens, se apreciaz c pentru nchiderea tranzitiv, cea mai potrivit metod de reprezentare este cea bazat pe matrice de adiacene.

Odat determinat nchiderea tranzitiv a unui graf orientat, rspunsul la ntrebarea:


Exist un drum n graful orientat de la nodul x la nodul y? este imediat.

Algoritmul lui Floyd poate fi specializat astfel nct s determine nchiderea tranzitiv
a unui graf G.

Algoritmul care rezult se numete algoritmul lui Warshall i care dei a


aprut tot n anul 1962 este anterior ca dat algoritmului lui Floyd. 12.3.1. Algoritmul lui Warshal

Algoritmul luiWarshall se bazeaz pe observaia simpl c, dac ntr-un graf orientat


exist o modalitate de a ajunge de la nodul i la nodul k i o modalitate de a ajunge de la nodul k la nodul j, parcurgnd arce ale grafului, atunci cu siguran exist un drum care conecteaz nodul i cu nodul j.

Problema const de fapt n a exploata de asemenea manier aceast observaie


nct calculul s se realizeze la o singur trecere prin matrice.

Acest lucru este posibil n baza urmtoarei interpretri sugerate de Warshall: Dac exist o posibilitate de a ajunge de la nodul i la nodul k utiliznd
numai noduri cu indici mai mici dect k, i o posibilitate de a ajunge de la nodul k la nodul j n aceleai condiii, atunci exist un drum de la nodul i la nodul j care strbate numai noduri care cu indicele mai mic ca i k+1.

n baza acestei interpretri, dndu-se graful ordonat G i matricea sa de adiacene A,


algoritmul lui Warshall determin matricea T care reprezint nchiderea tranzitiv a grafului G.

n aceast matrice T[i,j]=true, dac exist posibilitatea de a ajunge de la


nodul i la nodul j, altfel T[i,j]= false.

Spre exemplu n figura 12.3.a. (b) apare nchiderea tranzitiv n forma matricii T a
grafului orientat din figura 12.3.a. (a).
a 1

b 2 c 4 e (a) 3 5 2 1 d 1 2 3

1 1 1 1

2 1 1 1

3 1 1 1

matricea T

(b)

Fig.12.3.a. nchiderea tranzitiv a unui graf orientat

nchiderea tranzitiv poate fi determinat aplicnd o procedur similar procedurii


Floyd, utiliznd ns urmtoarea formul n cea de-a k-a trecere prin matricea T (formula [12.3.a]): ------------------------------------------------------------Tk[i,j]= Tk-1[i,j] OR (Tk-1[i,k] AND Tk-1[k,j]) [12.3.a] --------------------------------------------------------

Aceast formul precizeaz c exist un drum de la nodul i la nodul j care nu trece


printr-un nod cu numr mai mare ca i k dac:

(1) Exist deja un drum de la i la j care nu trece prin nici un nod cu numr
mai mare dect k-1, sau

(2) Exist un drum de la i la k care nu trece prin nici un nod cu numr mai
mare dect k-1 i exist un drum de la k la j, care nu trece prin niciun nod cu numr mai mare dect k-1.

Ca i n cazul algoritmului lui Floyd, sunt valabile formulele Tk[i,k]=Tk-1[i,k]


i Tk[k,j]= Tk-1[k,j] motiv pentru care n calcul se poate utiliza o singur instan a matricii T.

Structura de principiu a procedurii care implementeaz algoritmul lui Warshall apare


n secvena [12.3.a]. -----------------------------------------------------------PROCEDURE Warshall(A: ARRAY[1..n,1..n] OF boolean; VAR T: ARRAY[1..n,1..n] OF boolean); {Procedura construiete n T nchiderea tranzitiv a lui A} VAR i,j,k: integer BEGIN [1] FOR i:= 1 TO n DO [2] FOR j:= 1 TO n DO [3] T[i,j]:= A[i,j]; [12.3.a] [4] FOR k:= 1 TO n DO [5] FOR i:= 1 TO n DO [6] FOR j:= 1 TO n DO [7] IF T[i,j] = false THEN [8] T[i,j]:= T[i,k] AND T[k,j] END; {Warshall} ------------------------------------------------------------

n urma unei analize sumare a codului, performana algoritmului rezult imediat,


O(n3).

Dup ali autori, performana poate fi stabilit i astfel. Fiecare din cele a arce conduce la o iteraie cu n pai n bucla FOR cea mai
interioar.

n plus, sunt testate i eventual actualizate toate cele n2 locaii ale matricii T. Rezult un timp de execuie proporional cu O(an + n2) [Se 88]. 12.4. Traversarea grafurilor orientate Tehnicile fundamentate de traversare a grafurilor dezvoltate n cadrul
capitolului 10, au un caracter universal i ele pot fi aplicate, cu particularizri specifice, oricrui tip de graf.

Astfel n cazul grafurilor orientate, n timpul traversrii se ine cont efectiv de


orientarea arcelor examinate, lucru care n contextul grafurilor neorientate nu este necesar.

Din acest motiv i arborii de acoperire rezultai n urma procesului de traversare


a grafurilor orientate au o structur mai complicat.

n cele ce urmeaz vor fi abordate unele aspecte legate de traversarea grafurilor orientate
prin tehnica cutrii n adncime.

Opiunea este motivat de faptul c aceast manier de traversare a grafurilor


orientate st la baza rezolvrii a numeroase probleme practice care se pun n legtur cu aceast categorie de grafuri.

12.4.1. Traversarea grafurilor orientate prin tehnica cutrii "n adncime"

Principiul traversrii n adncime este deja cunoscut. Se presupune c exist un graf orientat G n care toate nodurile sunt marcate
iniial cu nevizitat.

Cutarea n adncime acioneaz iniial selectnd un nod x al lui G ca i nod de


start, nod care este marcat cu vizitat.

n continuare, fiecare nod nevizitat adiacent lui x este "cutat" pe rnd, utiliznd
aceeai tehnic n manier recursiv.

n momentul n care toate nodurile la care se poate ajunge pornind de la x au


fost vizitate, traversarea este ncheiat.

Dac totui mai rmn noduri nevizitate, se selecteaz unul dintre acestea drept
urmtorul nod de start i se relanseaz cutarea recursiv.

Acest proces se repet pn cnd sunt parcurse toate nodurile grafului G. Pentru implementare se consider c graful G care se dorete a fi traversat este
reprezentat cu ajutorul listelor de adiacene.

Se noteaz cu L(x) lista de adiacene a nodului x. De asemenea se mai utilizeaz tabloul marc, ale crui elemente pot lua
valorile "nevizitat" respectiv "vizitat", tablou care este utilizat n meninerea evidenei strii nodurilor grafului.

Structura de principiu a procedurii recursive de cutare n adncime apare n secvena


[12.4.1.a].

Aceast procedur trebuie apelat ns dintr-un context mai general care


asigur iniializarea tabloului marc i selectarea nodurilor nc nevizitate ale grafului (secvena [12.4.1.b]). -----------------------------------------------------------PROCEDURE CautInAdncime(x: Nod);

VAR k: Nod; BEGIN [1] marc[x]:= vizitat; [2] Prelucrare(x): [3] FOR fiecare nod k din L(x) DO [12.4.1.a] [4] IF marc[k] = nevizitat THEN [5] CautInAdncime(k) END; {CautInAdncime} -----------------------------------------------------------{Programul principal} BEGIN FOR x:= 1 TO n DO marc[x]:= nevizitat; FOR x:= 1 TO n DO [12.4.1.b] IF marc[x] = nevizitat THEN CautInAdncime(x) END; ------------------------------------------------------------

Se face precizarea, c procedura CautInAdncime nu realizeaz nici o


prelucrare efectiv a nodurilor vizitate, aceasta fiind sugerat generic prin apelativul Prelucrare(x) n linia [2] a secvenei [12.4.1.a].

Dup cum s-a precizat, aceast tehnic st la baza rezolvrii mai multor probleme
specifice grafurilor orientate.

n consecin, prelucrarea nodurilor vizitate va mbrca o form specific funcie


de problema care se dorete a fi soluionat n baza acestei tehnici de parcurgere a grafurilor orientate.

Performana procedurii CautInAdncime, analizat n contextul parcurgerii


unui graf orientat cu a arce, cu na, n reprezentarea bazat pe liste de adiacene este O(a), dup cum s-a evideniat n capitolul 10.

Pentru exemplificarea procesului de traversare a grafurilor orientate prin metoda


cutrii n adncime:

Se presupune c procedura din secvena [12.4.1.b] este aplicat grafului


orientat din figura 12.4.1.a. (a), considernd c nodul de pornire iniial este nodul a (x=a).

Graful se consider reprezentat printr-o structur de adiacene sugerat n


aceeai figura (b).

f e

a b c bcd c dac efg fb

c (a)

e, f, g;

gde

a, b, c, d;

g, f;

e;

(b)

f;

g;

e;

e, f, b, c, d, a, g; (c)

Fig.12.4.1.a. Traversarea unui graf orientat

Algoritmul marcheaz nodul a cu vizitat i selecteaz nodul b, primul din lista


de adiacene a lui a.

Deoarece nodul b este nevizitat, cutarea continu prin realizarea unei apel
CautInAdncime(b).

n continuare se marcheaz b cu vizitat i se selecteaz primul nod din lista sa


de adiacene.

Presupunnd c nodul c apare naintea lui d n aceast list, aa cum se


prezint n figur, se apeleaz CautInAdncime(c).

Deoarece lista de adiacene a lui c este vid, cutarea revine n lista lui b de
unde se selecteaz nodul d.

Se parcurge n continuare lista de adiacene a lui d. ntruct nodurile a i c care apar n lista de adiacene a lui d au fost deja
vizitate, cutarea lui d se ncheie i se revine n lista lui b apoi n cea a lui a,care sunt i ele epuizate.

n acest moment apelul iniial CautInAdncime(a) s-a terminat. Totui, deoarece graful nu a fost nc parcurs n ntregime ntruct nodurile
e,f i g sunt nc nevizitate, se realizeaz un nou apel al procedurii CautInAdncime spre exemplu pentru nodul e, apel care asigur parcurgerea integral a grafului.

Se face urmtoarea observaie.

Dac graful din fig.12.4.1.a. (a) ar fi un graf neorientat, el ar reprezenta o


singur component conex i ar putea fi parcurs integral, realiznd un singur apel al procedurii CautInAdncime din cadrul secvenei [12.4.1.b] indiferent de nodul care este selectat drept punct de start.

n cazul grafurilor orientate situaia se schimb. Numrul de apeluri nerecursive ale procedurii CautInAdncime, realizat
n cadrul secvenei [12.4.1.b] depinde n mod esenial de ordinea n care sunt selectate nodurile care reprezint puncte de start.

Spre exemplu n cazul mai sus prezentat, graful apare constituit din
dou componente conexe (a,b,c,d) i (e,f,g).

Dac n locul nodului e, la cel de-al doilea apel ar fi fost selectat nodul
g apoi e ar fi rezultat trei componente conexe (a,b,c,d),(g,f) i (e)

Dac ar fi fost selectate nodurile f,g i e n aceast ordine ar fi


rezultat 4 componente conexe.

n sfrit, dac se alege iniial nodul e drept nod de start, graful din
figur conine o singur component conex (fig.12.4.1.a. (c)).

Aceast particularitate se reflect direct n topologia arborilor de acoperire care


rezult n urma unor astfel de parcurgeri ale grafurilor orientate.

12.5. Grafuri orientate aciclice Un graf orientat aciclic este un graf orientat care nu conine cicluri. Apreciate n termenii relaiilor pe care le modeleaz, grafurile orientate aciclice au un
caracter de generalitate mai pronunat dect arborii dar sunt mai puini generale ca i grafurile orientate.

Ca i topologie, astfel de grafuri pot conine multe cicluri, dac nu se ia n considerare


direcionarea arcelor.

Dac aceast direcionare este ns luat n considerare un astfel de graf nu


conine nici un ciclu.

De fapt aceste grafuri pot fi considerate parial arbori, parial grafuri orientate, element
care le confer o serie de proprieti speciale.

Spre exemplu, pdurea de arbori de cutare n adncime asociat unui graf


orientat aciclic, nu conine arce de tip napoi.

n figura 12.5.a. apare un exemplu de arbore (a), un exemplu de graf orientat


aciclic (b) i un exemplu de graf orientat cu un ciclu (c).

Fig.12.5.a. Tipuri de grafuri orientate

Printre altele, grafurile orientate aciclice sunt utile n reprezentarea structurii sintetice a
expresiilor aritmetice care conin subexpresii comune.

Spre exemplu figura 12.5.b. evideniaz un astfel de graf pentru expresia


aritmetic: --------------------------------------------------------((a+b)*c+((a+b)+e)*(e+f))*((a+b)*c) ---------------------------------------------------------

Termenii a+b i (a+b)*c reprezint subexpresii comune partajate, motiv


pentru care sunt reprezentate prin noduri care sunt destinaia mai multor arce orientate.
* + * + c + * +

Fig.12.5.b. Graf orientat aciclic reprezentnd o expresie aritmetic

Grafurile orientate aciclice pot fi utilizate cu succes n reprezentarea relaiei de


ordonare parial.

Se reamintete faptul c o relaie de ordonare parial R pe o mulime M, este o


relaie binar care satisface urmtoarele proprieti:

(1) aRa este fals pentru aM (nereflexivitate); (2) Pentru a,b,cM, dac aRb i aRc sunt adevrate, atunci aRc
este adevrat (tranzitivitate);

(3) Dac aRb este adevrat i bRa este adevrat, atunci a=b pentru

a,bM (antisimetrie).

Dou exemple naturale de relaii de ordonare parial sunt:

(1) Relaia mai mic dect (<) definit pe mulimea numerelor ntregi (2) Relaia submulime proprie a unei mulimi ( ) definit pentru mulimi
de elemente.

Spre exemplu fie mulimea M={1,2,3} i fie P(M) puterea mulimii M, adic
mulimea tuturor submulimilor proprii ale mulimii M.

n acest context P(M)= {{},{1},{2},{3},{1,2},{1,3},{2,3},


{1,2,3}}.

Este simplu de verificat c relaia submulime a mulimii M ( ) este o relaie


de ordonare parial pentru puterea mulimii M.

Grafurile orientate aciclice pot fi utilizate n reprezentarea unei astfel de relaii. n acest, scop o relaie R poate fi asimilat cu o mulime de perechi (arce), care
satisfac urmtoarea proprietate: perechea(a,b) aparine mulimii dac aRb este adevrat.

n aceste condiii, este valabil urmtoarea definiie: dac R este o relaie de ordonare
parial pe o mulime M, atunci graful G=(M,R) este un graf ordonat aciclic.

Reciproc, se presupune c G=(M,R) este un graf ordonat aciclic i c R+ este o relaie

definit prin afirmaia aR+b este adevrat dac i numai dac exist un drum de lungime mai mare sau egal cu 1 care conecteaz nodul a cu nodul b n graful G.

R+ este de fapt mulimea relaiilor care materializeaz nchiderea tranzitiv a lui


R.

n aceste condiii, R+ reprezint o relaie de ordonare parial pe M. n figura 12.5.c apare graful orientat aciclic G=(P(M),R) unde M={1,2,3}. Relaia R+ se traduce prin submulime proprie a puterii mulimii M.
{ 1, 2, 3 } { 1, 2 } {1} { 1, 3 } {2} {} { 2, 3 } {3}

Fig.12.5.c. Graf orientat aciclic reprezentnd submulimile proprii ale unei mulimi date

12.5.1. Determinarea aciclitii unui graf orientat

Se consider un graf orientat G=(N,A) i se cere s se stabileasc dac G este aciclic, cu


alte cuvinte s se determine dac G nu conine cicluri.

Pentru a rezolva aceast problem poate fi utilizat cu succes tehnica cutrii n


adncime.

Astfel, dac pe parcursul traversrii grafului G prin tehnica cutrii n adncime


se ntlnete cel puin un arc de tip napoi, n mod evident graful conine cel puin un ciclu.

Reciproc, dac un graf orientat conine cel puin un ciclu, atunci n orice
traversare a grafului prin tehnica cutrii n adncime va apare cel puin un arc de tip napoi.

Pentru a demonstra acest lucru, se presupune c G este ciclic. Realiznd o traversare prin cutare n adncime n G, va exista cu siguran n
ciclu un nod x, al crui numr de ordine la cutarea n adncime este mai mic dect numrul corespunztor oricrui nod aparinnd ciclului.

Se consider un arc (y,x) din ciclul care-l conine pe x. Deoarece y este n ciclu, el trebuie s fie un descendent al lui x n pdurea de
arbori de cutare prin cuprindere.

Deci (y,x) nu poate fi un arc de trecere. Deoarece numrul de ordine la cutarea n adncime a lui y este mai mare dect
numrul lui x, (y,x) nu poate fi nici arc de tip arbore nici arc de tip nainte.

n consecin (y,x) nu poate fi dect un arc de tip napoi.


12.5.2. Aplicaie. Sortarea topologic

Sortarea topologic a mai fcut obiectul unor prezentri pe parcursul acestei lucrri. n paragraful de fa se prezint o alt modalitate de soluionare a sortrii topologice
utiliznd drept structuri de date suport grafurile orientate aciclice.

Se reamintete faptul c un proiect de mari dimensiuni, este adesea divizat ntr-o colecie
de activiti (taskuri) mai mici, fiecare avnd un caracter mai mult sau mai puin unitar.

n vederea finalizrii proiectului, unele dintre activiti trebuiesc realizate ntr-o


anumit ordine specificat.

Spre exemplu, o program universal poate conine o serie precizat de cursuri dintre
care unele presupun n mod obligatoriu absolvirea n prealabil a altora.

O astfel de situaie poate fi modelat simplu cu ajutorul grafurilor orientate


aciclice.

Spre exemplu dac cursul D este un curs care nu poate fi urmat dect dup
absolvirea cursului C, n graf apare un arc (C,D).

n figura 12.5.1.a apare un graf orientat aciclic care evideniaz intercondiionrile de


aceast natur impuse unui numr de 5 cursuri.

Cursul C3 spre exemplu, presupune absolvirea n prealabil a cursurilor C1 i C2.

C1

C3 C5

C2

C4

Fig.12.5.1.a. Graf orientat aciclic modelnd intercondiionri

Sortarea topologic realizeaz o astfel de ordonare liniar a activitilor proiectului nct


niciuna dintre intercondiionrile impuse s nu fie violate.

Cu alte cuvinte, sortarea topologic este un proces de ordonare liniar a nodurilor


unui graf orientat aciclic, astfel nct dac exist un arc de la nodul i la nodul j, atunci nodul i s apar naintea nodului j n ordonarea liniar.

Spre exemplu lista C1,C2, C3,C4,C5 reprezint o sortare topologic a grafului din
figura 12.5.1.a

Sortarea topologic poate fi realizat simplu pornind de la algoritmul traversrii unui


graf prin tehnica cutrii n adncime.

Astfel, dac n procedura CautInAdncime din secvena [12.4.1.a] se adaug


dup linia [5] o instruciune de tiprire a lui x, se obine o procedur care afieaz nodurile grafului aciclic sortate topologic n ordine invers (secvena [12.5.1.a]).

Acest lucru se ntmpl deoarece procedura SortTopologic afieaz un nod


oarecare x al grafului aciclic dup ce a terminat explorarea (afiarea) tuturor descendenilor si.

Se impune n acest moment urmtoarea precizare: realizearea sortrii topologice n


ordine invers pentru un graf, este echivalent cu realizarea unei sortri topologice, normale n graful obinut prin inversarea sensului arcelor [Se 88].

Este de asemenea evident faptul c de regul ordonarea produs de acest tip de sortare
nu este unic. -----------------------------------------------------------PROCEDURE SortTopologic(x: Nod);

{Afieaz nodurile accesibile din x, n ordine topologic invers} VAR k: Nod; [12.5.1.a] BEGIN marc[x]:= vizitat; FOR fiecare nod k din L(x) DO IF marc[k] = nevizitat THEN SortTopologic(k); writeln(x) END; {SortTopologic} -------------------------------------------------------------

Tehnica utilizat este perfect funcional deoarece la parcurgerea unui graf orientat
aciclic nu apar arce de tip napoi.

Se consider momentul la care cutarea n adncime prsete nodul x. Toate arcele care apar n pdurea de arbori de cutare n adncime asociat
grafului i care provin din nodul x, sunt sau arce de arbore, sau arce de tip "nainte, sau arce de "trecere".

Toate acest arce sunt ns direcionate spre noduri a cror vizit s-a ncheiat i n
consecin, evidenierea lor precede evidenierea lui x n cadrul ordinii care se construiete.

12.6. Componente puternic conectate O component puternic conectat a unui graf orientat este o submulime de noduri ale
grafului n care exist un drum de la oricare nod al mulimii la oricare alt nod aparinnd aceleeai mulimi.

Fie G=(N,A) un graf orientat. Se partiioneaz mulimea N a nodurilor grafului G n clase de echivalen
Ni,(1ir), pe baza urmtoarei definiii a relaiei de echivalen:

Nodurile x i y sunt echivalente dac i numai dac exist un drum de la nodul


x la nodul y i un drum de la nodul y la nodul x.

Fie Ai,(1ir) mulimea arcelor ale cror surse i destinaii aparin mulimii Ni. Grafurile Gi=(Ni,Ai) se numesc componentele puternic conectate ale grafului G,
sau mai simplu componente puternice.

Un graf orientat care const dintr-o singur component puternic se numete puternic
conectat.

n figura 12.6.a apare un graf orientat (a), care conine dou componente puternice (b).

a, b, c

d (a)

d (b)

d (c)

Fig.12.6.a. Componente puternic conectate i graful redus al unui graf orientat

Se face precizarea c fiecare nod al unui graf orientat aparine unei componente
puternice dar exist arce care nu aparin nici unei componente.

Astfel de arce se numesc arce de transfer i ele conecteaz noduri aparinnd


la componente puternice diferite.

Considernd componentele puternice drept noduri i reprezentnd interconexiunile


dintre componentele puternice ale uni graf G, respectiv reprezentnd arcele de transfer, se obine graful redus al grafului G.

Nodurile grafului redus sunt componentele puternice ale grafului orginal. n graful redus apare un arc de la componente Ci la componenta Cj dac n
graful origine G exist un arc ce leag un nod aparinnd lui Ci cu un nod aparinnd lui Cj.

Graful redus este ntotdeauna un graf orientat aciclic, deoarece dac ar conine
vreun ciclu, atunci toate componentele din acel ciclu aparin unei aceleeai componente puternic conectate, element ce ar evidenia faptul c determinarea componentelor puternice pentru graful original s-a realizat defectuos.

n figura 12.6.1. (c) apare graful redus al grafului orientat din fig. 12.6.1. (a). n continuare se vor prezenta doi algoritmi pentru determinarea componentelor puternic
conectate ale unui graf orientat, ambii bazai pe tehnica cutrii n adncime.

12.6.1. Algoritmul lui Kosaraju-Sharir

Algoritmul pentru determinarea componentelor puternic conectate ale unui graf orientat
G care va fi prezentat n continuare, a fost sugerat n anul 1978 de R.Kosaraju (nepublicat) i publicat n anul 1981 de ctre Sharir, motiv pentru care va fi denumit algoritmul KosarajuSharir.

Algoritmul KosarajuSharir const din urmtorii pai: (1) Se realizeaz o traversare prin cutare n adncime a grafului G i se
numeroteaz nodurile n ordinea terminrii apelurilor recursive corespunztoare lor.

Acest lucru se poate realiza, spre exemplu, numerotnd nodul x dup


linia [5] a procedurii CautInAdancime din secvena [12.4.1.a].

(2) Se construiete un nou graf orientat Gr, inversnd sensul tuturor arcelor
grafului original G.

(3) Se realizeaz o traversare prin cutare n adncime n graful Gr, ncepnd cu


nodul care are numrul cel mai mare conform numerotrii de la pasul 1.

Dac aceast traversare nu acoper toate nodurile, se lanseaz


urmtoarea traversare ncepnd cu nodul care are numrul cel mai mare dintre nodurile neparcurse nc.

Se continu n aceeai manier pn la epuizarea tuturor nodurilor. (4) Fiecare arbore de cutare n adncime al pdurii care rezult, este o
component puternic conectat a grafului G.

n figura 12.6.1.a este ilustrat aplicarea algoritmului Kosaraju-Sharir asupra grafului


orientat (a).
a 4

b a b c

3 4 2 a b 3

d (a)

d (b)

d (c)

b (d)

Fig.12.6.1.a. Determinarea componentelor puternic conectate ale unui graf orientat

Astfel, dup traversarea grafului ncepnd cu nodul a i continund cu b, se obine


arborele de cutare n adncime i numerotarea nodurilor din fig. 12.6.1.a. (b).

Inversnd sensurile arcelor grafului original, rezult graful Gr (fig.12.6.1.a. (c)). n continuare, realiznd o traversare prin cutare n adncime a lui Gr rezult pdurea
din aceeai figur (d).

ntr-adevr, traversarea ncepe cu nodul a, considerat c rdcin, deoarece a are cel


mai mare numr.

Din a se ajunge la nodul c i la nodul b. Urmtorul arbore de cutare n adncime are rdcina d, deoarece d este nodul
cu numrul cel mai mare dintre cele rmase neparcurse.

Fiecare arbore al acestei pduri formeaz o component puternic conectat a grafului


orientat original G.

12.6.2. Algoritmul lui Tarjan

O alt metod ingenioas de determinare a componentelor puternic conectate ale unui


graf orientat a fost publicat de R.E. Tarjan n anul 1972.

Metoda se bazeaz tot pe tehnica cutrii n adncime i o variant de implementare a


sa apare n secvena [12.6.2.a] n forma funciei Tarjan.

n legtur cu aceast secven se fac cteva precizri. (1) Graful se consider reprezentat printr-o structur de adiacene implementat
cu ajutorul listelor nlnuite simple.

(2) Funcia Tarjan prezentat, utilizeaz variabila min pentru a determina cel
mai nalt nod care poate fi atins prin intermediul unui arc de tip napoi, pentru orice descendent al nodului k pe care l primete ca i parametru.

Acest lucru este realizat ntr-o manier similar funciei care determin
componentele biconexe ale unui graf (secvena [10.5.2.3.a], capitolul 10).

-----------------------------------------------------------FUNCTION Tarjan(k: integer): integer; {Determinarea componentelor puternice } VAR t: legatura; m,min: integer; BEGIN id:= id + 1; marc[k]:= id; min:= id; Stiva[p]:= k; p:= p + 1; t:= Stradj[k]; WHILE t <> z DO BEGIN [12.6.2.a] IF marc[t^.nume] = 0 THEN m:= Tarjan(t^.nume); ELSE m:= marc[t^.nume]; IF m < min THEN min:= m; t:= t^.urm END; IF min = marc[k] THEN BEGIN REPEAT p:= p - 1; write(nume(Stiva[p])); marc[Stiva[p]]= N+1 UNTIL Stiva[p] = k; writeln END; Tarjan:= min; END; {Tarjan} ------------------------------------------------------------

n plus ns, valoarea min determinat, este utilizat i la evidenierea componentelor


puternic conectate.

n acest scop se utilizeaz o stiv implementat ca un tablou Stiva controlat de


indicele p.

n aceast stiv se introduc numele nodurilor pentru care este apelat funcia
Tarjan imediat dup intrarea n apel, acestea urmnd a fi afiate prin extragere din stiv dup vizitarea ultimului membru al componentei puternic conectate determinate.

Elementul esenial al determinrii este verificarea min=marc[k] efectuat la


terminarea apelurilor recursive;

Dac testul conduce la valoarea de adevr, se afieaz toate nodurile din stiv
ntruct ele aparin aceleeai componente puternic conectate ca i nodul k.

Acest algoritm poate fi ns adaptat s realizeze prelucrri mult mai sofisticate dect
simpla afiare a componentelor puternic conectate.

Fiind bazat pe tehnica cutrii n adncime, n grafuri reprezentate prin structuri de


adiacene, algoritmul lui Tarjan obine o performan de ordinul O(n+a).

Interpretarea execuiei algoritmului lui Tarjan este urmtoarea. (1) Un nod x care nu are descendeni sau legturi de tip napoi n arborele de
cutare n adncime, determin o component puternic conectat.

(2) Dac un nod x are un descendent n arborele de cutare n adncime din care
pornete un arc de tip napoi spre x i nu are nici un descendent din care s porneasc vreun arc de tip "napoi" spre vreun nod situat deasupra lui x n arborele de cutare n adncime, atunci nodul x mpreun cu toi descendenii si (cu excepia acelor noduri care satisfac proprietatea 1o, a nodurilor care satisfac proprietatea 2o i a descendenilor lor), determin o component puternic conectat.

(3) Fiecare descendent y al nodului x care nu satisface nici una din cele dou
situaii mai sus precizate, are descendeni care sunt sursa unor arce de tip napoi care ajung la noduri mai nalte ca x n arborele de cutare n adncime.

Pentru un astfel de nod, exist un drum direct de la x la y rezultat din


parcurgerea arborelui de cutare n adncime.

Mai exist ns un drum de la nodul y la nodul x care poate fi determinat


cobornd n arbore de la y n jos pn la nodul descendent de la care printr-un arc de tip napoi se ajunge la un strmo al lui y i apoi continund n aceeai manier, se ajunge pn la x.

Rezult c nodul y aparine aceleeai componente puternic conectate ca


i nodul x.

Aceste situaii pot fi urmrite n figura 12.6.2.a care reprezint pdurea de arbori de

cutare n adncime (b) corespunztoare grafului orientat (a).

G B C

J D F (a) E L

G C

J K

M (b)

Fig.12.6.2.a. Graf orientat (a) i pdure de arbori de cutare n adncime asociat (b)

Nodurile B i K satisfac prima situaie, astfel nct se constituie ele nsele n


componente puternice ale grafului.

Nodurile F (reprezentnd pe F,E i D), H (reprezentnd pe H i I) i A


(reprezentnd pe A,G,J,L,M i C) satisfac a doua situaie.

Membrii componentei evideniate de A au fost determinai dup


eliminarea nodurilor B,K i F i a descendenilor lor care apar n componentele puternice stabilite anterior.

Restul nodurilor se ncadreaz n situaia a treia. O subliniere foarte important este aceea ca odat un nod parcurs, el primete n tabloul
marc o valoare mare (N+1), astfel nct arcele de trecere spre aceste noduri sunt ignorate.

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