Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Grafuri orientate
Dup cum s-a mai precizat, grafurile orientate sunt grafuri n care arcele care
conecteaz nodurile au un singur sens.
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.
De multe ori arcele orientate reflect anumite tipuri de relaii de preceden n aplicaia
pe care o modeleaz.
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:
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
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.
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.
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).
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.
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.
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).
1 10 30 2 50 3 10 20 4 5 60 100
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.
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
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
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.
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].
Se presupune c algoritmul din secvena [12.1.1.a], opereaz asupra unui graf orientat
cu n noduri i a arce.
ntruct aceast bucl este executat de n-1 ori, (bucla FOR din linia [4]),
timpul total de execuie va fi proporional cu O(n2).
(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.
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.
De fapt rezultatul execuiei algoritmului lui Dijkstra este un tablou care conine
distana de la origine la restul nodurilor grafului.
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.
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.
------------------------------------------------------------------------
i Ak-1[ i,j ]
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
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} ------------------------------------------------------------
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),
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).
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
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.
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.
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
Pentru a defini termenul de cel mai central nod se definete pentru nceput
noiunea de excentricitate a unui nod aparinnd unui graf ponderat.
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)).
(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).
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.
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.
Algoritmul lui Floyd poate fi specializat astfel nct s determine nchiderea tranzitiv
a unui graf G.
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.
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)
(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.
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.
n cele ce urmeaz vor fi abordate unele aspecte legate de 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.
n continuare, fiecare nod nevizitat adiacent lui x este "cutat" pe rnd, utiliznd
aceeai tehnic n manier recursiv.
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.
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; ------------------------------------------------------------
Dup cum s-a precizat, aceast tehnic st la baza rezolvrii mai multor probleme
specifice grafurilor orientate.
f e
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)
Deoarece nodul b este nevizitat, cutarea continu prin realizarea unei apel
CautInAdncime(b).
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.
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)
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)).
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.
De fapt aceste grafuri pot fi considerate parial arbori, parial grafuri orientate, element
care le confer o serie de proprieti speciale.
Printre altele, grafurile orientate aciclice sunt utile n reprezentarea structurii sintetice a
expresiilor aritmetice care conin subexpresii comune.
(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).
(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.
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.
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.
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
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.
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.
Spre exemplu, o program universal poate conine o serie precizat de cursuri dintre
care unele presupun n mod obligatoriu absolvirea n prealabil a altora.
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).
C1
C3 C5
C2
C4
Spre exemplu lista C1,C2, C3,C4,C5 reprezint o sortare topologic a grafului din
figura 12.5.1.a
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:
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)
Se face precizarea c fiecare nod al unui graf orientat aparine unei componente
puternice dar exist arce care nu aparin nici unei componente.
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.
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.
(2) Se construiete un nou graf orientat Gr, inversnd sensul tuturor arcelor
grafului original G.
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.
b a b c
3 4 2 a b 3
d (a)
d (b)
d (c)
b (d)
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).
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.
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 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.
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.
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.
Aceste situaii pot fi urmrite n figura 12.6.2.a care reprezint pdurea de arbori de
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)
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.