Pagini recente » Cod sursa (job #2964971) | Cod sursa (job #2071675) | Cod sursa (job #844641) | Cod sursa (job #2365954) | Cod sursa (job #1041463)
#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
#include<set>
using namespace std;
ifstream fin("biconex.in");
ofstream fout("biconex.out");
#define MAX_N 200000
int n, m;
vector<int> list[MAX_N];
set<int> cmp[MAX_N];
int contor=-1;
stack<pair<int,int> >st;
int lvl[MAX_N];
void read(){
fin >> n >> m;
int a, b;
for(int i=1; i<=m; i++){
fin >> a >> b;
list[a].push_back(b);
list[b].push_back(a);
}
}
bool viz[MAX_N];
void df(int nod, int niv, int father){
viz[nod] = true;
lvl[nod] = niv;
int next;
for(size_t i=0; i<list[nod].size(); i++){
next = list[nod][i];
if(next == father)
continue;
if(!viz[next]) {
pair<int,int> myPair = make_pair(nod,next);
st.push(myPair);
df(next,niv+1, nod);
if(lvl[next] >= niv && st.size() ){
pair<int,int> p = make_pair(nod,next);
contor ++;
while(st.top() != p ){
cmp[contor].insert(st.top().first);
cmp[contor].insert(st.top().second);
st.pop();
}
cmp[contor].insert( st.top().first);
cmp[contor].insert(st.top().second);
st.pop();
}
}
if(lvl[next] < lvl[nod]){
lvl[nod] = lvl[next];
}
}
}
int main(){
read();
for(int i=1; i<=n; i++){
if(!viz[i]) df(i,1,0);
}
fout << contor +1<< '\n';
for(size_t i=0; i<=contor; i++){
for(set<int>::iterator it = cmp[i].begin(); it!=cmp[i].end(); it++){
fout << *it << " ";
}
fout << endl;
}
return 0;
}