Pagini recente » Cod sursa (job #2659500) | Cod sursa (job #167094) | Cod sursa (job #2910790) | Cod sursa (job #997222) | Cod sursa (job #2305460)
#include <fstream>
#include <iostream>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 100001
int M,N;
vector<int> L[MAXN];
int LEVEL[MAXN+1];
int LOWER[MAXN+1];
vector < set<int> > C;
stack<pair<int,int>> S;
void cache_bc(int node1, int node2){
set<int> con;
int elem1, elem2;
do {
elem1 = S.top().first;
elem2 = S.top().second;
S.pop();
con.insert(elem1);
con.insert(elem2);
}
while(elem1!=node1 || elem2!=node2);
C.push_back(con);
}
void depth(int node, int prev, int level){
vector <int>::iterator it;
LEVEL[node]=level;
LOWER[node]=level;
for (it = L[node].begin(); it != L[node].end(); it++) {
if (*it == prev)
continue ;
if (LEVEL[*it] == -1) { // nod nevizitat
S.push(make_pair(node,*it));
depth(*it, node, level + 1);
if(LOWER[node] > LOWER[*it])
LOWER[node] = LOWER[*it];
if(LOWER[*it] >= LEVEL[node])
cache_bc(node,*it);
}
else{ // nod parinte
if(LOWER[node] > LEVEL[*it])
LOWER[node] = LEVEL[*it];
}
}
}
int main(void){
freopen("biconex.in","r",stdin);
//freopen("biconex_test1.in","r",stdin);
freopen("biconex.out","w",stdout);
scanf("%d %d",&N,&M);
int x,y;
for(int i=0;i<M;i++){
scanf("%d %d",&x,&y);
L[x].push_back(y);
L[y].push_back(x);
}
for(int i=1;i<=N;i++)
LEVEL[i]=-1;
depth(1, 0, 0);
printf("%d\n",C.size());
for (int i = 0; i < C.size(); i++) {
set<int>::iterator it;
for (it = C[i].begin(); it!=C[i].end(); it++)
printf("%d ",*it);
printf("\n");
}
return 0;
}