Sunteți pe pagina 1din 52

Tema 7.

Biconexitate

1. Noțiuni generale
2. Algoritmul de determinare a:
1. punctelor critice
2. punților
3. componentelor biconexe
Fie G=(V,E) un graf neorientat conex:
• un nod al grafului se numește punct de articulație sau nod critic dacă
subgraful obținut prin eliminarea lui nu este conex;
• o muchie se numește punte sau muchie critică dacă graful parțial
obținut prin eliminarea ei nu este conex;
• un graf neorientat se numește biconex dacă nu conține puncte de
articulație;
• se numește componentă biconexă un subgraf biconex maximal – prin
adăugarea încă a unui nod nu mai este biconex.
Exemple:
Exemplu. Puncte de articulatie
Exemplu. Punti
Exemplu de graf biconex.

1 3 2

5 6
8
4
7
Observații:
1. pentru fiecare muchie critică, cel puțin o extremitate este punct de
articulație;

2. fiecare punct de articulație face parte din cel puțin două


componente biconexe;

3. nodurile care fac parte dintr-un ciclu aparțin aceleiași componente


biconexe;

4. fiecare muchie critică reprezintă ea însăși o componentă biconexă;

5. o muchie este critică dacă nu face parte dintr-un ciclu;


Algoritmul de determinare a punctelor critice

Determinarea punctelor de articulatie prin algoritmul bazat pe


parcurgerea în adâncime a grafului.
Definiție. Arborele obținut la parcurgerea in adincime se numeste
arbore DFS
Considerăm G=(V,E) graful dat și A arborele de parcurgere în adâncime.
Muchiile graful pot fi doar:
1) muchii de parcurgere, folosite la înaintarea în arbore
2) muchii de întoarcere; o muchie (k,x) este de întoarcere dacă x este
ascendent al lui k în arborele A – nodul x a fost descoperit anterior
nodului k
Exemplu. Să parcurgem in adâncime graful din exemplu. Să
determinăm: muchiile de parcurgere si de intoarcere
Propoziții:
- un nod k al grafului, diferit de rădăcina
arborelui DFS, este punct de articulație
dacă și numai dacă are un descendent
direct x în arborele A cu proprietatea că
de la niciun descendent al lui x sau de la
x nu există muchie de întoarcere la
niciun ascendent al lui k; nu se referă la
nodurile frunză.
- rădăcina arborelui DFS este punct de
articulație dacă și numai dacă are în
acest arbore cel puțin doi descendenți
direcți.
1 – nu este punct de articulație, deoarece
este radăcină și are un singur descedent
2 –este punct de articulație deoarece are
fiul 3, care nu are muchie de intoarcere
către ascendenți
3 – nu are fii – nu este punct de articulatie
4 – nu are fii
5 este punct de articulație (7- nu are
muchie de intoarcere)
6 –are fiul 8 – are muchie de intoarcere-nu
este punct de articulatie
7 –este punct de articulatie
8 – nu este punct de articulatie
Informatie pentru determinarea punctului de articulatie in cod.
Pentru a determina punctele de articulație, punțile și componentele
biconexe vom determina pentru fiecare nod k următoarele informații:
-nivel[k] – nivelul pe care se află nodul k în arborele DFS;
• nivel[rădăcină] = 1;
• nivel[k] = nivel[tata[k]] + 1;
-nma[k] – nivelul minim la care se poate ajunge din k, mergând numai
pe muchii de arbore și folosind ca ultimă muchie o muchie de
întoarcere. Îl vom numi nivelul minim accesibil și este egal cu minimul
dintre următoarele 3 valori :
• nivelul nodului curent
• minimul dintre nivelurile nodurilor cu care este legat nodul curent printr-o
muchie de întoarcere
• minimul dintre nivelurile minime accesibile ale fiilor nodului curent din cadrul
arborelui DFS
Informatie pentru determinarea punctului de articulatie
in cod.

nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 5 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 5 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
Pentru 1 nu putem calcula deoarece are fii

2 nu putem calcula are fii

Pentru 3 putem calcula, nu area fii si nici


muchie de intoarcere

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
Pentru 1 nu putem calcula deoarece are fii

2 nu putem calcula are fii

Pentru 3 putem calcula, nu area fii si nici


muchie de intoarcere

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
Pentru 2 nu putem calcula deoarece are fii
5 nu putem calcula are fii
Pentru 4 putem calcula, nu area fii, are
muchie de intoarcere: min(nivel(4), nivel(1))

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
Pentru 2 nu putem calcula deoarece are fii

5 nu putem calcula are fii

Pentru 4 putem calcula, nu area fii, are


muchie de intoarcere

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
5 nu putem calcula deoarece are fii

7 nu putem calcula are fii


6 nu putem calcula are fii
Pentru 8 putem calcula, nu area fii, are
muchie de intoarcere

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
5 nu putem calcula deoarece are fii

7 nu putem calcula are fii


6 nu putem calcula are fii
Pentru 8 putem calcula, nu area fii, are
muchie de intoarcere

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
6 putem calcula min{nivel(6), nma(8)}

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
6 putem calcula min{nivel(6), nma(8)}

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
7 putem calcula min{nivel(7), nma(6)}

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
7 putem calcula min{nivel(7), nma(6)}

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
5 putem calcula:
min[(nivel(5), min{nma(4), nma(7)}]
Min[3, 1, 4]

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
5 putem calcula:
min[(nivel(5), min{nma(4), nma(7)}]
Min[3, 1, 4]

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
2 putem calcula:
min[(nivel(2), min{nma(5), nma(3)}]
Min[2, 1, 3]

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 2 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
1 putem calcula:
min[(nivel(1), min{nma(2)}

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
nma[k]=min[(nivel(k),
min{nivel[yi], (yi ,k) –muchie de intoarcere},
min{nma[yi], yi- fii a lui k}]
1 putem calcula:
min[(nivel(1), min{nma(2)}

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
un nod k care nu este rădăcina arborelui este
punct de articulație dacă și numai dacă are cel
puțin un fiu x pentru care nivelul minim
accesibil este mai mare sau egal cu nivelul
nodului (nivel[k] <= nma[x]).

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
(nivel[k] <= nma[x]).
2 1 nu este punct de articulație, deoarece este
rădăcina arborelui și are un singur descendent
direct
2 este punct de articulație, deoarece 3 este fiu
al lui 2 și nivel[2] <= nma[3]
3 nu este punct de articulație, deoarece nu are
niciun fiu
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
(nivel[k] <= nma[x]).
2 4 nu este punct de articulație, deoarece nu are
niciun fiu
5 5 este punct de articulație deoarece 7 este fiu
al lui 5 și nivel[5] <= nma[7]
6 nu este punct de articulație; pentru singurul
fiu al lui 6, 8 relația este nivel[6] > nma[8]

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
(nivel[k] <= nma[x]).
2 7 este punct de articulație deoarece 6 este fiu
al lui 7 și nivel[7] <= nma[6]
5 8 nu este punct de articulație deoarece nu are
7 fii

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
Determinarea punțile

Pentru a determina punțile:


Se determina muchiile de parcurgere (k,x) pentru
care nivelul lui k este mai mic decât nivelul minim
accesibil al lui x:
nivel[k] < nma[x].
Pentru muchia de parcurgere (k,x)
2 nivel[k] < nma[x].
Muchia (1,2) nivel[1]=nma[2]. Nu este punte.
5 Muchia (2,3) nivel[2]<nma[3]. Este punte.
7

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
Pentru muchia de parcurgere (k,x)
2 nivel[k] < nma[x].
Muchia (1,2) nivel[1]=nma[2]. Nu este punte.
5 Muchia (2,3) nivel[2]<nma[3]. Este punte.
7 Muchia (2,5) nivel[2]>nma[5]. Nu este punte.
Muchia (5,4) nivel[5]>nma[4]. Nu este punte.
Muchia (5,7) nivel[5]<nma[7]. Este punte.

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
Pentru muchia de parcurgere (k,x)
2 nivel[k] < nma[x].
Muchia (1,2) nivel[1]=nma[2]. Nu este punte.
5 Muchia (2,3) nivel[2]<nma[3]. Este punte.
7 Muchia (2,5) nivel[2]>nma[5]. Nu este punte.
Muchia (5,4) nivel[5]>nma[4]. Nu este punte.
Muchia (5,7) nivel[5]<nma[7]. Este punte.
Muchia (7,6) nivel[7]=nma[6]. Nu este punte.
Muchia (6,8) nivel[6]>nma[8]. Nu este punte.
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
Algoritmul de determinare a componentelor biconexe

- Se analizeaza nodurile la vizitarea lor conform parcurgerii și se


eliminăm la determinarea unei componente biconexe:
- dacă pentru nodul curent k avem un descendent direct x pentru care
nivel[k] <= nma[x], se va elimina nodurile până la nodul x, inclusiv
- nodurile eliminate, împreună cu nodul k reprezintă o componentă biconexă;
- eliminarea se face până la x, nu până la k, deoarece între acestea, pot fi
noduri din altă componentă biconexă.
Observație. Condiția nivel[k] <= nma[x] are loc întotdeauna pentru
rădăcina arborelui DFS, chiar dacă acesta nu este punct de articulație.
În acest caz se determină o componentă biconexă din care face parte
rădăcina. Acest lucru se întâmplă și când graful dat este biconex:
determinarea componentei biconexe se face la revenirea în rădăcină.
Exemplu. Să se determine componentele
biconexe.
Se parcurge graful in adancime- DFS:
1, 2, 3, 5, 4, 7, 6, 8
DFS: 1, 2, 3, 5, 4, 7, 6, 8
Analiza respectarii inegalitătii nivel[k] <= nma[x] (x
descedent direct) se poate verifica incepand cu
ultimul nod:
Se analizează muchia (6,8) conform parcurgerii. 8
este descedent pentru 6:
nivel[6] <= nma[8]? NU!
Se analizează muchia (7,6) conform parcurgerii. 6
este descedent pentru 7:
nivel[7] <= nma[6]? DA!
Nodurile 7, 6, 8 formeaza o componentă biconexă

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2, 3, 5, 4, 7, 6, 8
Analiza respectarii inegalitătii nivel[k] <= nma[x] (x
descedent direct
Se analizează muchia (6,8) conform parcurgerii. 8
este descedent pentru 6:
nivel[6] <= nma[8]? NU!
Se analizează muchia (7,6) conform parcurgerii. 6
este descedent pentru 7:
nivel[7] <= nma[6]? DA!
Nodurile 7, 6, 8 formeaza o componentă conexă

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2, 3, 5, 4, 7
- Se exclude din parcurgere nodurile 6 și 8
-Analiza respectarii inegalitătii nivel[k] <= nma[x]
(x descedent direct) :
Se analizează muchia (5,7) conform parcurgerii.
7 este descedent pentru 5:
nivel[5] <= nma[7]? DA!

Nodurile 5, 7 formeaza o componentă biconexă

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2, 3, 5, 4, 7
- Se exclude din parcurgere nodurile 6 și 8
-Analiza respectarii inegalitătii nivel[k] <= nma[x]
(x descedent direct) :
Se analizează muchia (5,7) conform parcurgerii.
7 este descedent pentru 5:
nivel[5] <= nma[7]? DA!

Nodurile 5, 7 formeaza o componentă conexă

k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2, 3, 5, 4
- Se exclude din parcurgere nodul 7
-Analiza respectarii inegalitătii nivel[k] <= nma[x] (x
descedent direct) :
Se analizează muchia (5,4). 4 este descedent p/u 5:
nivel[5] <= nma[4]? Nu!
Se analizează muchia (2,5). 5 este descedent p/u 2:
nivel[2] <= nma[5]? Nu!
Muchia (1,2). 2 este descedent p/u 1:
nivel[1] <= nma[2]? Da!
Nodurile 1,2,5,4 formeaza o componentă biconexă
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2, 3, 5, 4
- Se exclude din parcurgere nodul 7
-Analiza respectarii inegalitătii nivel[k] <= nma[x] (x
descedent direct) :
Se analizează muchia (5,4). 4 este descedent p/u 5:
nivel[5] <= nma[4]? Nu!
Se analizează muchia (2,5). 5 este descedent p/u 2:
nivel[2] <= nma[5]? Nu!
Muchia (1,2). 2 este descedent p/u 1:
nivel[1] <= nma[2]? Da!
Nodurile 1,2,5,4 formeaza o componentă biconexă
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2,3
- Conform algoritmului parcurs trebuie să excludem
din parcurgere toate nodurile 4,5,2. Dar deoarece s-a
analizat nodul 1, care este rădăcină și pentru care
intotdeuna are loc nivel[k] <= nma[x] (x descedent
direct) si a rămas noduri, care nu au fost analizate se
va exclude doar 4 si 5
-Analiza respectarii inegalitătii :
Se analizează muchia (2,3). 3 este descedent p/u 2:
nivel[2] <= nma[3]? DA!
Nodurile 2,3 formeaza o componentă biconexă
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4
DFS: 1, 2, 3, 5, 4, 7, 6, 8
- Conform algoritmului parcurs trebuie să excludem
din parcurgere toate nodurile 4,5,2. Dar deoarece s-a
analizat nodul 1, care este rădăcină și pentru care
intotdeuna are loc nivel[k] <= nma[x] (x descedent
direct) si a rămas noduri, care nu au fost analizate se
va exclude doar 4 si 5
-Analiza respectarii inegalitătii :
Se analizează muchia (2,3). 3 este descedent p/u 2:
nivel[2] <= nma[3]? DA!
Nodurile 2,3 formeaza o componentă biconexă
k 1 2 3 4 5 6 7 8
Nivel[k] 1 2 3 4 3 5 4 6
Nma[k] 1 1 3 1 1 4 4 4

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