Pagini recente » Cod sursa (job #2375193) | Cod sursa (job #895457) | Cod sursa (job #786802) | Cod sursa (job #1009127) | Cod sursa (job #2804061)
#include <bits/stdc++.h>
using namespace std;
ifstream in("biconex.in");
ofstream out("biconex.out");
const int lim=1e5+4;
const int inf=1e9+7;
stack<pair<int,int> > st;
vector<int> vec[lim];
vector<int> fii[lim];
int add[lim];
int rev[lim];
bool ok[lim];
int n,m,x,y;
set<int> gr[lim];
int cnt;
void df(int nod)
{
ok[nod]=true;
rev[nod]=inf;
for(int x:vec[nod])
if(!ok[x])
{
st.push({nod,x}),
fii[nod].push_back(x),
add[x]=add[nod]+1,df(x),
rev[nod]=min(rev[nod],rev[x]);
if(rev[x]>=add[nod])
{
++cnt;
/// cout<<cnt<<": "<<nod<<' '<<xx<<'\n';
while(!st.empty() and st.top()!=make_pair(nod,x))
gr[cnt].insert((st.top()).first),
gr[cnt].insert((st.top()).second),
st.pop();
if(!st.empty())
gr[cnt].insert((st.top()).first),
gr[cnt].insert((st.top()).second),
st.pop();
}
}
else
{
if(add[x]<add[nod]-1)
rev[nod]=min(rev[nod],add[x]);
}
/// cout<<nod<<' '<<rev[nod]<<'\n';
}
int main()
{
in>>n>>m;
for(int i=1;i<=m;++i)
in>>x>>y,
vec[x].push_back(y),
vec[y].push_back(x);
df(1);
out<<cnt<<'\n';
for(int i=1;i<=cnt;++i)
{
for(int x:gr[i])
out<<x<<' ';
out<<'\n';
}
return 0;
}