Pagini recente » Cod sursa (job #2742122) | Cod sursa (job #2602348) | Cod sursa (job #3187010) | Cod sursa (job #3215139) | Cod sursa (job #3302249)
#include <fstream>
#include <set>
#include <stack>
#include <vector>
using namespace std;
ifstream cin("biconex.in");
ofstream cout("biconex.out");
int n, m, comp, x, y, root, id, copii, C;
stack<pair<int, int>>S;
vector<int> L[100002];
set<int>cb[100002];
int niv[100002], low[100002], viz[100002];
set<int>s;
void dfs(int nod){
viz[nod]=1;
low[nod]=niv[nod];
id=min(id, nod);
for(int i=0;i<L[nod].size();i++){
int vecin=L[nod][i];
if(viz[vecin]){
low[nod]=min(low[nod], niv[vecin]);
}
else{
S.push({nod, vecin});
niv[vecin]=niv[nod]+1;
dfs(vecin);
low[nod]=min(low[nod], low[vecin]);
if(nod==root)
copii++;
if(low[vecin]>=niv[nod]){
++C;
while(1){
pair<int, int> p=S.top();
cb[C].insert(p.first);
cb[C].insert(p.second);
S.pop();
if(p.first==nod && p.second==vecin){
break;
}
}
}
}
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
L[x].push_back(y);
L[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(!viz[i]){
comp++;
niv[i]=1;
root=i;
dfs(i);
}
}
cout<<C<<"\n";
for(int i=1;i<=C;i++){
for(auto it:cb[i]){
cout<<it<<" ";
}
cout<<"\n";
}
}