Pagini recente » Cod sursa (job #832770) | Cod sursa (job #1690337) | Cod sursa (job #2734517) | Cod sursa (job #1378157) | Cod sursa (job #3192672)
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>
const int NMAX=100005;
using namespace std;
ifstream fin("biconex.in");
ofstream fout("biconex.out");
vector <int> v[NMAX], cb[NMAX];
int low[NMAX], in[NMAX];
stack <pair<int, int>> st;
int n, m, nrc;
void dfs(int, int);
void prnt(int, int);
int main()
{
int a, b, i;
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1, 1);
fout<<nrc<<'\n';
for(i=1; i<=nrc; i++)
{
sort(cb[i].begin(), cb[i].end());
cb[i].erase(unique(cb[i].begin(), cb[i].end()), cb[i].end());
for(auto i:cb[i]) fout<<i<<' ';
fout<<'\n';
}
return 0;
}
void dfs(int nod, int lvl)
{
in[nod]=low[nod]=lvl;
for(auto i:v[nod])
{
if(!in[i])
{
st.push({nod, i});
dfs(i, lvl+1);
low[nod]=min(low[nod], low[i]);
if(low[i]>=in[nod]) prnt(nod, i);
}
else low[nod]=min(low[nod], in[i]);
}
}
void prnt(int a, int b)
{
nrc++;
int aa, bb;
do
{
aa=st.top().first;
bb=st.top().second;
cb[nrc].push_back(aa);
cb[nrc].push_back(bb);
st.pop();
}while(aa!=a || bb!=b);
}