Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://www.pbinfo.ro/probleme/1572/componentebiconexe
- #include <fstream>
- #include <algorithm>
- #include <vector>
- #include <array>
- using namespace std;
- ifstream cin("componentebiconexe.in");
- ofstream cout("componentebiconexe.out");
- #define RADACINA 1
- const int mxN = 1e5;
- vector<int> adj[mxN+10],order,compBi[mxN+10], pA; // pA -> puncte de articulatie
- vector<array<int,2>> mC; // mC -> muchii critice
- int depth[mxN+10], minD[mxN+10]; // minD -> nivel minim accesibil
- int visited[mxN+10], nrCompBi;
- void DFS(int node, int parent)
- {
- order.push_back(node); // order -> ordinea in care sunt parcurse nodurile in DFS
- visited[node] = true;
- depth[node] = depth[parent] + 1;
- minD[node] = depth[node];
- int cntVis = 0;
- bool isCrit = false; // daca este punct de articulatie / nod critic
- for(auto it : adj[node])
- {
- if(it == parent) continue;
- if(visited[it])
- minD[node] = min(minD[node], depth[it]);
- else
- {
- cntVis++;
- DFS(it,node);
- minD[node] = min(minD[node],minD[it]);
- if(depth[node] <= minD[it]) isCrit = true;
- if(depth[node] < minD[it])
- mC.push_back({node,it});
- if(depth [node] <= minD[it]) // componenta biconexa
- {
- nrCompBi++;
- while(order.back() != it)
- compBi[nrCompBi].push_back(order.back()), order.pop_back();
- // fac parte din componenta si (node) si (it) care inca nu sunt adaugate.
- compBi[nrCompBi].push_back(node);
- compBi[nrCompBi].push_back(it);
- order.pop_back(); // era it acum.
- }
- }
- }
- if(node == RADACINA && cntVis < 2)
- isCrit = false;
- if(isCrit)
- pA.push_back(node);
- }
- int main()
- {
- int cerinta;
- cin >> cerinta;
- int n , m ;
- cin >> n >> m;
- for(int i = 1;i<=m;i++)
- {
- int a, b;
- cin >> a >> b;
- adj[a].push_back(b);
- adj[b].push_back(a);
- }
- DFS(1,0);
- if(cerinta == 1) // sa se afiseze componentele biconexe
- {
- cout << nrCompBi << '\n';
- for(int i = 1;i<=nrCompBi;i++)
- {
- cout << compBi[i].size() << ' '; // nr de elem din componenta
- for(auto it : compBi[i]) // afisam elementele din componenta
- cout << it << ' ';
- cout << '\n';
- }
- }
- if(cerinta == 2) // sa se afiseze punctele de articulatie (punctele critice)
- {
- cout << pA.size() << '\n';
- for(auto it : pA)
- cout << it << ' ';
- cout << '\n';
- }
- if(cerinta == 3) // sa se afiseze puntile (muchiile) critice
- {
- cout << mC.size() << '\n';
- for(auto it : mC)
- cout << it[0] << ' ' << it[1] << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment