Documente Academic
Documente Profesional
Documente Cultură
Spre exemplu, dndu-se traseele aeriene ale unui stat se cere s se precizeze
drumul optim dintre dou orae.
o Criteriul de optimalitate poate fi spre exemplu timpul sau preul, drumul
optim putnd s difere pentru cele dou situaii.
Structurile de date care pot modela n mod natural situaii de natura celor mai sus
prezentate sunt cele derivate din conceptul matematic cunoscut sub denumirea de
graf.
10.1. Definiii
Un graf, n cea mai larg accepiune a termenului, poate fi definit ca fiind 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.
b
c
d
e
Ordinul unui graf este numrul de noduri pe care acesta le conine i se noteaz
cu |G|.
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.
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.
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
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].
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.
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
G
B
A
M
I
L
C
J
K
J
K
D
F
(a)
E
(b)
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.
n figura 10.1.g este prezentat un graf (a) i un arbore de acoperire al grafului (b).
G
B
D
F
C
D
E
(a)
E
(b)
y
(a)
E
(b)
1
G
(c)
-----------------------------------------------------------TDA Graf
(Varianta 1 - Shiflet)
[10.2.1.a]
Modelul matematic: graful definit n sens matematic.
Notaii:
TipGraf
TipElement
TipCheie
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.
Aceast activitate const de fapt din desemnarea unei structuri de date concrete care s
materializeze n situaia respectiv tipul de date abstract graf.
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.
Numele nodurilor pot fi de asemenea litere consecutive ale alfabetului care pot
fi convertite simplu n valori ntregi
(1) Tehnici specifice simple cum ar fi cele bazate pe tablouri sau liste
(2) Tehnici avansate bazate spre exemplu pe arbori binari ordonai sau pe
metoda dispersiei.
a b c d e
a
a
b
c
d
e
1
0
1
1
0
(a)
0
1
0
0
0
1
0
1
1
1
1
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].
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.
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.
TipCheie
TipInfo
= .......;
= .......;
TipElement = record
Cheie: TipCheie;
Info : TipInfo
end;
TipContor
TipIndex
TipTablouElem
TipMatrAdj
=
=
=
=
0..NumarNoduri;
1..NumarNoduri;
array[TipIndex] of TipElement;
array[TipIndex,TipIndex] of boolean;
TipGraf = record
contor : TipContor;
noduri : TipTablouElem;
arce
: TipMatrAdj
end;
[10.3.1.2.a]
TipArc = record
linie,
coloana : TipIndex
end;
var
g
k,k1,k2
e
indicNod
indicArc
:
:
:
:
:
TipGraf;
TipCheie;
TipElement;
TipIndex;
TipArc;
------------------------------------------------------------
contor = 4
1 2 3 4
noduri = [ a c d e ]
1
2
3
4
1 2 3 4
arce =
c
(a)
0
1
1
0
1
0
1
1
1
1
0
1
0
1
1
0
(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.
Dac tabloul noduri este neordonat localizarea unei chei se poate realiza
prin tehnica cutrii liniar.
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:
(3) Inseria unui nod depinde de asemenea de maniera de organizarea datelor n cadrul
tabloului noduri.
contor = 5
1 2 3 4 5
noduri = [ a c d e b ]
1 2 3 4 5
arce =
c
d
(a)
1
2
3
4
5
0
1
1
0
0
1
0
1
1
0
1
1
0
1
0
0
1
1
0
0
0
0
0
0
0
(b)
1 2 3 4
noduri = [ a b d e ]
1
2
3
4
1 2 3 4
arce =
(a)
0
0
1
0
0
0
0
0
1
0
0
1
0
0
1
0
(b)
(a) Dac tabloul noduri este neordonat, stergerea lui c se poate realiza prin
mutarea ultimului element al tabloului n locul su.
g.contor := g.contor - 1
end; {SuprimNod}
------------------------------------------------------------
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:
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.
a
a
b
c
d
(a)
StrAdj
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.
multilist.
Pentru fiecare nod al acestei liste se pstreaz o list a arcelor, adic o list
nlnuit a cheilor nodurilor adiacente.
(a)
TipNod
elem urmNod incepAdj
g
TipAdj
cheieAdj urmAdj
indicArc
v1 v2
indicNod
(b)
= .....;
= .....;
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
end;
TipArc
[10.3.2.2.a]
= 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.
Procedura care realizeaz suprimarea n aceast manier a unui arc apare n secvena
[10.3.2.2.b]
(a)
g
b
indicArc
c
(b)
[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}
------------------------------------------------------------
g
a
e
b
b
c
(a)
(b)
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)
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.
Un nod alb care este descoperit prima dat n traversare este colorat.
Un nod este colorat n negru cnd toate nodurile adiacente lui au fost
descoperite.
Acest subgraf este un graf conex aciclic, adic un arbore, care poate fi simplu
reprezentat prin tehnica "indicator spre printe".
Mrcile de timp sunt utilizate n muli algoritmi referitori la grafuri i ele ofer
indicii despre comportamentul n timp al algoritmilor
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]
v N
------------------------------------------------------------
Tabloul marc este poziionat iniial pe zero, astfel nct marc[x]=0 indic
faptul c nodul x nu a fost nc vizitat.
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.
1/14
2/
10/
C 12/ B G
12/13
BA
10/11
CA
C
6/7
DFE
D
F
3/8
E 4/ G F 6/ D
2/9
F A 3/ E D
(a)
4/5
GEA
(b)
1
A
2
F
4
G
6
D
10
C
11
12
B
13
3
E
14
(c)
Procesul de traversare pentru graful din fig. 10.4.1.2.a (a) se desfoar dup cum
urmeaz:
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).
A
B
G
F
D
F
(a)
(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.
(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.
(2) n ceea ce privete clasa a III-a de noduri, aceasta cuprinde nodurile pentru care se
vor realiza apeluri recursive i arcele 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
cu linie 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
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.
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.
G
B
A
B
C
D
E
F
G
H
I
J
K
L
M
C
D
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
EFG H I J K L M
0 1 1
0 0 0
0 0 0
1 1 0
0 1 1
1 0 0
1 0 0
011 1
1000
1001
1001
0 1
1 0
(b)
G
(a)
10
11
12
1
A
2
B
4
C
6
F
7
D
8
E
9
G
A
13
14
(c)
K
I
H
15
H
16
I
17
18
J
19
K
M
H
20
L
21
22
L
23
L
L
24
M
25
26
(d)
A
B
Acest lucru este evident ntruct n procesul de traversare este verificat fiecare
element al matricei de adiacene.
Aceast nseamn c se parcurge un arc care conduce la un nod care a mai fost
vizitat, deci graful conine un ciclu.
Algoritmul din secvena [10.4.2.a] insereaz arcele parcurse ale grafului ntr-o
mulime T despre care se presupune c este iniial vid, cu ajutorul operatorului
INSERTIE.
Se atrage atenia asupra faptului c n cazul cutrii prin cuprindere, un nod trebuie
marcat cu vizitat naintea ntroducerii sale n coad pentru a se evita plasarea sa
de mai multe ori n aceast structur.
10.4.2.1. Cutarea "prin cuprindere", varianta CLR
Cutarea prin cuprindere este una dintre cele mai cunoscute metode de cutare,
utilizate printre alii de ctre Djikstra i Prim n celebrii lor algoritmi [CLR92].
Toate nodurile sunt colorate iniial alb i ele devin mai trziu gri, apoi negre.
La prima descoperire a unui nod, acesta este colorat n gri.
Nodurile gri i negre sunt noduri deja descoperite n procesul de cutare, dar
ele sunt difereniate pentru a se asigura funcionarea corect a cutrii.
Dac arcul(n,v) A iar n este un nod negru, v este colorat fie n gri fie n negru.
n ultimul caz toate nodurile adiacente lui v au fost deja vizitate.
Nodurile gri mai pot avea ca adiaceni i noduri albe, ele marcheaz de fapt
frontiera dintre nodurile vizitate i cele nevizitate.
Ori de cte ori un nod v este descoperit pentru prima oar n procesul de
cutare la parcurgerea listei de adiacene a nodului u, acest lucru se marcheaz
prin sp[v]=u.
Dup cum s-a mai precizat subgraful predecesorilor este de fapt un arbore liber,
reprezentat printr-un tablou liniar cu n baza relaiei indicator spre printe.
CautaPrin Cuprindere(G:TipGraf,s:TipNod);
[1] for fiecare nod uN(G) do
begin
[2]
culoare[u]<-alb;
[3]
d[u]<-;
[4]
sp[u]<-nil
end
[5] culoare[s]<-gri; {s este nodul de start}
[6] d[s]<-0;
[7] sp[s]<-nil;
[8] Initializeaza(Q); Adauga(s,Q);
[9] while Q<> do
begin
[10.4.2.1.a]
[10]
u<-Cap(Q);
[11]
for fiecare vAdj[u] do
[12]
if culoare[v]=alb then
begin
[13]
culoare[v]<-gri;
[14]
d[v]<-d[u]+1;
[15]
sp[v]<-u;
[16]
Adauga(v,Q)
END
[17]
Scoate(Q)
[18]
culoare[u]<-negru
end
------------------------------------------------------------
Funcionarea algoritmului.
Liniile 1- 4 iniializeaz structurile de date, adic:
Toate nodurile u cu excepia nodului de start sunt marcate cu alb n tabloul
culoare
Nodurile gri din coad sunt noduri descoperite n procesul de cutare n liste
de adiacene care nu au fost nc epuizate.
Analiza performanei.
Se analizeaz timpul de execuie al algoritmului pentru un graf G=(N,A).
Dup iniializare nici un nod nu mai este ulterior colorat n alb, ca atare testul din
linia 12 asigur faptul c fiecare nod este adugat cozii cel mult odat i este scos din
coad cel mult odat.
Operaiile Adauga i Scoate din coad consum un timp O(1), ca atare timpul total
dedicat operrii cozii Q este O(N).
Deoarece lista fiecrui nod este scanat exact naintea scoaterii nodului din coad
aceast operaie se realizeaz cel mult odat pentru fiecare nod.
Deoarece suma lungimilor tuturor listelor de adiacen este O(A), timpul total
necesar pentru scanarea listelor de adiacene este cel mult O(A).
A F C B G
BA
CA
DFE
E G F D
FAED
GEA
HIJK
IH
JHK
KHJ
LM
ML
G
B
C
D
(a)
(b)
D
A
1
A
H
2
F
3
C
4
B
5
G
6
E
7
D
9
H
L
10
I
11
J
12
K
13
14
L
15
M
16
(c)
D
(d)
Se consider graful din figura 10.4.2.2.a (a) reprezentat prin structura de adiacene din
aceeai figur (b),
Ordinea
de
parcurgere
a
arcelor
va
fi
urmtoarea:
AF,AC,AB,AG,FA,FE,FD,CA,
BA,GE,GA,DF,DE,EG,EF,ED,HI,HJ,HK,IH,JH,JK,KH,KJ,IM,MI.
n acest caz, un arc (x,y) se consider ramur a arborelui de cutare, dac n bucla
for a secvenei [10.4.2.a], respectiv while a secvenei [10.4.2.2.a] nodul y,
respectiv t^.urm este vizitat ntia dat venind dinspre nodul x.
n cazul cutrii prin cuprindere n grafuri neorientate, fiecare arc care nu este o
ramur a arborelui de cuprindere, este un arc de trecere care conecteaz dou noduri
dintre care niciunul nu este strmoul celuilalt.
Arborii de cutare afereni parcurgerii grafului (a) din figura fig. 10.4.2.2.a apar n
aceeai figur (d).
Dup cum s-a precizat, aceti arbori cuprind acele arce care conduc ntia dat la
un anumit nod.
Dup cum s-a precizat n 10.1, un graf cu n noduri i n sau mai multe arce,
trebuie s aib cel puin un ciclu.
Cu toate acestea i un graf cu n noduri i n-1 sau mai puin arce poate avea cicluri, dac
conine dou sau mai multe componente conexe.
O modalitate sigur de a determina ciclurile unui graf este aceea de a-i construi pdurea
arborilor de cutare prin cuprindere.
Fiecare nod al grafului este plasat n coad o singur dat, astfel corpul buclei
while (secvena [10.4.2.2.a]) se execut o singur dat pentru fiecare nod.
Fiecare arc (x,y) este examinat de dou ori, odat pentru x i odat pentru y.
Astfel, dac graful are n noduri i a arce, timpul de execuie al algoritmului de cutare
prin cuprindere este O(max (n,a)) dac utilizm reprezentarea prin structuri de adiacen.
Traversarea unui graf, indiferent de metoda utilizat, are principial un caracter unitar,
particularizarea rezultnd din structura de date utilizat n implementare. Astfel, n
ambele tehnici de traversare, nodurile pot fi divizate n trei clase:
(1) Clasa "arbore" care cuprinde nodurile care au fost extrase din structura
de date utilizat n traversare, adic nodurile deja vizitate colorate n negru;
Un arbore de cutare ia natere conectnd fiecare nod din clasa arbore cu nodul
care a cauzat introducerea sa n structura de date utilizat n parcurgere.
Pentru a parcurge n mod sistematic o component conex a unui graf (deci pentru a
implementa o procedur parcurge) se introduce un nod oarecare al componentei n
clasa vecintate i toate celelalte noduri n clasa nentlnite.
(1) La parcurgerea n adncime se alege din vecintate nodul cel mai recent
ntlnit (ultimul ntlnit) ceea ce corespunde cu utilizarea unei stive pentru
pstrarea nodurilor din vecintate.
(2) La parcurgerea prin cuprindere se alege nodul cel mai devreme ntlnit
(primul ntlnit) ceea ce presupune pstrarea ntr-o coad a nodurilor din clasa
vecintate.
Se pot utiliza n acest scop i alte structuri de date, spre exemplu cozi bazate pe
prioritate [Cr 87] n cazul grafurilor ponderate.
Contrastul dintre cele dou metode de parcurgere este i mai evident n cazul
grafurilor de mari dimensiuni.
Cutarea prin cuprindere acoper complet zona din jurul punctului de plecare
mergnd mai departe numai cnd tot ceea ce este n imediatat sa apropiere a
fost parcurs.
n afara diferenelor rezultate din manierele de operare ale celor dou metode, se
remarc diferene fundamentale n ceea ce privete implementarea.
Acesta este nc un exemplu care evideniaz cu pregnan legtura strns care exist
ntre o anume structur de date i algoritmul care o prelucreaz.
n cadrul grafurilor, noiunea de conexiune joac un rol central i ea este strns legat de
noiunea de arc, respectiv de noiunea de drum.
Se reamintete c un graf conex este acela n care pentru fiecare nod al su exist un
drum spre oricare alt nod al grafului.
[10.5.2.1.a]
begin
Componenta(x);
writeln
end
end; {ComponenteConexe}
------------------------------------------------------------
Alte variante ale procedurii de cutare n adncime cum ar fi cea aplicat grafurilor
reprezentate prin matrice de adiacene sau cea nerecursiv, precum i cutarea prin
cuprindere, modificate n aceeai manier, vor evidenia aceleai componente conexe,
dar nodurile vor fi vizualizate n alt ordine.
Funcie de natura prelucrrilor ulterioare ale grafului pot fi utilizate i alte metode.
Astfel spre exemplu, se poate introduce tabloul invmarc (inversul tabloului
marc) care se completeaz ori de cte ori se completeaz tabloul marc, respectiv
cnd marc[x]:= id se asigneaz i invmarc[id]:= x.
Aceste valori pot fi memorate separat sau pot fi marcate n tabloul invmarc,
spre exemplu primind valori negative (opuse).
A F C B G
BA
CA
DFE
E G F D
FAED
GEA
HIJK
IH
JHK
KHJ
LM
ML
G
B
C
D
(a)
(b)
x
3 4 5 6 7 8
10
11
12
13
nume[x]
A B
C D E F G H I
marc[x]
5 3 2 4 8 9
10
11
12
13
invmarc[x]
-1
7 4 3 2 -8 9
10
11 -12
13
n anumite situaii este util a se prevedea mai mult dect un drum ntre nodurile unui graf
cu scopul de a rezolva posibile cderi ale unor puncte de contact (noduri).
Astfel, spre exemplu n reeaua feroviar exist mai multe posibiliti de a ajunge
ntr-un anumit loc.
Un punct de articulaie al unui graf conex este un nod, care dac este suprimat,
graful se rupe n dou sau mai multe buci.
A
B
C
D
Un graf are conexitatea k sau altfel spus are numrul de conexitate egal cu k dac
prin suprimarea a oricare k-1 noduri ale sale graful rmne conex [FK69].
Spre exemplu, un graf are conexitatea doi, dac i numai dac nu are puncte
de articulaie, cu alte cuvinte, dac i numai dac este biconex.
n vederea determinrii punctelor de articulaie ale unui graf conex, poate fi utilizat,
printr-o extensie simpl, traversarea grafurilor prin tehnica cutrii n adncime.
G
B
D
F
F
E
M
E
G
L
D
C
Un nod oarecare x al unui graf nu este un punct de articulaie dac fiecare fiu y al
su are printre descendeni vreun nod conectat (printr-o linie punctat) cu un nod
situat n arbore deasupra lui x, cu alte cuvinte, dac exist o conexiune alternativ de
la x la y.
Rdcina este un punct de articulaie dac are doi sau mai muli fii deoarece
singurul drum care conecteaz fii rdcinii trece prin rdcina nsi.
Acest numr poate corespunde chiar lui x sau oricrui nod z la care se
poate ajunge pornind de la x, cobornd zero sau mai multe arce ale
arborelui pn la un descendent w (w poate fi chiar x), iar apoi urmnd
un arc de retur (w,z).
Rdcina este punct de articulaie dac i numai dac are doi sau mai muli
fii.
Un nod x, altul dect rdcina este un punct de articulaie dac i numai dac
exist vreun fiu y al lui x astfel nct valoarea min pentru y este mai mare
sau egal cu numrul de ordine al lui x.
Funcia Articulaie determin de fapt n manier recursiv cel mai nalt punct al
arborelui care poate fi atins via un arc de retur pentru orice descendent al unui nod x
furnizat ca parametru i utilizeaz aceast informaie pentru a stabili dac x este un
punct de articulaie.
Dup cum s-a precizat, aceasta presupune o simpl comparaie ntre valoarea m,
adic minimul determinat pentru nodul curent i marc[x], adic numrul de
ordine al lui x.
n plus, mai este necesar a se verifica dac x nu este cumva rdcina arborelui de
cutare n adncime cu alte cuvinte, dac x nu este cumva primul nod parcurs n
apelul funciei Articulaie pentru componenta conex a grafului care conine
nodul x.
Aceast verificare se face n afara funciei recursive, motiv pentru care ea nu este
prezent n secvena [10.5.2.3.a].
Aceast secven care de fapt afieaz punctele de articulaie, poate fi uor extins
pentru a realiza i alte prelucrri asupra punctelor de articulaie sau a componentelor
biconexe.
Deoarece procedeul deriv din traversarea grafurilor prin tehnica cutrii n adncime,
efortul su de execuie este proporional cu O(n+a) n reprezentarea grafurilor prin
structuri de adiacene respectiv cu O(n2) n reprezentarea bazat pe matrice de adiacene,
n reprezentnd numrul de noduri, iar a numrul de arce al grafului.