Pagini recente » Cod sursa (job #1976706) | Cod sursa (job #3131124) | Cod sursa (job #824291) | Cod sursa (job #996077) | Cod sursa (job #2305498)
#include <fstream>
#include <iostream>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 100001
#define Min(a, b) ((a) < (b) ? (a) : (b))
int M,N;
vector<int> L[MAXN];
vector<int> dfn, low;
vector <vector <int> > C;
stack <pair <int, int> > S;
void cache_bc(const int x, const int y){
vector <int> con;
int tx, ty;
do {
tx = S.top().first;
ty = S.top().second;
S.pop();
con.push_back(tx);
con.push_back(ty);
}
while (tx != x || ty != y);
C.push_back(con);
}
void DF(int node, int fn, int number){
vector <int>::iterator it;
dfn[node] = low[node] = number;
for (it = L[node].begin(); it != L[node].end(); it++) {
if (*it == fn) continue ;
if (dfn[*it] == -1) {
S.push( make_pair(node, *it) );
DF(*it, node, number + 1);
low[node] = Min(low[node], low[*it]);
if (low[*it] >= dfn[node])
cache_bc(node, *it);
}
else
low[node] = Min(low[node], dfn[*it]);
}
}
int main(void){
freopen("biconex.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);
}
dfn.resize(N + 1);
dfn.assign(N + 1, -1);
low.resize(N + 1);
DF(1, 0, 0);
printf("%d\n",C.size());
for (int i = 0; i < C.size(); i++) {
sort(C[i].begin(), C[i].end());
C[i].erase(unique(C[i].begin(), C[i].end()), C[i].end());
for (int j = 0; j < C[i].size(); j++)
printf("%d ",C[i][j]);
printf("\n");
}
return 0;
}