Fişierul intrare/ieşire:biconex.in, biconex.outSursăArhiva educationala
AutorArhiva EducationalaAdăugată deMariusMarius Stroe Marius
Timp execuţie pe test0.4 secLimită de memorie20480 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Componente biconexe

Se dă un graf neorientat G = (V, E). Un graf se numeşte graf biconex dacă nu are puncte de articulaţie. Un nod se numeşte punct de articulaţie dacă subgraful obţinut prin eliminarea nodului şi a muchiilor incidente cu acesta nu mai este conex. O componentă biconexă a unui graf este un subgraf biconex maximal cu această proprietate.

Cerinţă

Dându-se un graf neorientat G = (V, E) se cere să se determine componentele sale biconexe.

Date de intrare

Fişierul de intrare biconex.in conţine pe prima linie două numere naturale N şi M ce reprezintă numărul de noduri din G şi numărul muchiilor. Pe următoarele M linii se vor afla câte două numere naturale x şi y, separate prin spaţiu, reprezentând muchia neorientată (x, y).

Date de ieşire

În fişierul de ieşire biconex.out se va afişa pe prima linie un singur număr reprezentând numărul componentelor biconexe. Pe fiecare din următoarele linii se va scrie câte o componentă biconexă prin enumerarea nodurilor componente. Acestea pot fi afişate în orice ordine.

Restricţii

  • 2 ≤ N ≤ 100 000
  • 1 ≤ M ≤ 200 000
  • Pentru aflarea corectă doar a numărului componentelor biconexe se va acorda 40% din punctaj.

Exemplu

biconex.inbiconex.out
8 9
1 2
2 3
3 4
4 1
1 5
5 6
6 7
7 5
7 8
4
1 2 3 4
7 8
5 6 7
1 5

Explicaţie

În graful neorientat din exemplu componentele sale biconexe sunt reprezentate prin cerculeţe. Notaţi că o muchie poate aparţine unei singure componente biconexe pe când un nod poate aparţine mai multor componente biconexe.

Indicaţii de rezolvare

Toate informaţiile necesare le găsiţi în cartea "Introducere in algoritmi", Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest. În exerciţiul 23-2 se tratează teoretic problema determinării componentelor biconexe.

Pentru a descompune graful în componente biconexe am folosit proprietăţile parcurgerii DFS. După o parcurgere DFS muchiile grafului se vor clasifica în două categorii:

  • muchii care aparţin arborelui DFS (muchiile normale din figură);
  • muchii care nu aparţin arborelui şi care unesc un nod cu un strămoş al său, aceste muchii numindu-se muchii de întoarecere (muchiile reprezentate punctat în figură).

Problema determinării componentelor biconexe este strâns legată de problema determinării punctelor de articulaţie. După parcurgerea anterioară, un nod X va fi nod de articulaţie dacă există cel puţin un fiu al său Y din care nu se poate ajunge la un strămoş al lui X pe un alt drum „în jos” în arborele DFS şi apoi pe o muchie de întoarcere. Folosind o stivă în care reţinem muchiile din graf în ordinea în care sunt întâlnite în timpul parcurgerii, atunci când întâlnim un nod X care are un fiu Y cu proprietăţile de mai înainte, vom elimina din stivă toate muchiile până la muchia (X, Y) inclusiv. Acest muchii formează o componentă biconexă. În desenul din dreapta, muchiile (X, Y) cu proprietatea de mai sus sunt (7, 8), (5, 6), (1, 5) şi (1, 2).

Dacă graful este reprezentat prin liste de adiacenţă atunci complexitatea algoritmului este O(N + M).

Probleme suplimentare

În multe aplicaţii practice modelate cu ajutorul grafurilor, punctele de articulaţie nu sunt de dorit. Să considerăm o reţea de telecomunicaţii. Dacă o centrală dintr-un punct de articulaţie se defectează atunci comunicarea este întreruptă nu numai cu centrala respectivă ci şi cu alte centrale. Deci, un graf biconex este dorit.

Printre problemele care folosesc ideile de mai sus se numără:

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?

remote content