Pagini recente » Cod sursa (job #149451) | Cod sursa (job #1969174) | Cod sursa (job #2506982) | Cod sursa (job #315296) | Cod sursa (job #613584)
Cod sursa(job #613584)
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxN=100005;
const int maxM=200005;
vector<int> G[maxN],S[maxN];
int n,m,nr,ns,l[maxN],par[maxN],viz[maxN],lv[maxN],s1[maxM],s2[maxM];
void citire()
{
freopen("biconex.in","r",stdin);
freopen("biconex.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
}
void dfs(int x)
{
viz[x]=1;
l[x]=lv[x];
for(int i=0;i<G[x].size();++i)
{
int ff=G[x][i];
if(!viz[ff])
{
lv[ff]=lv[x]+1;
par[ff]=x;
ns++; s1[ns]=x; s2[ns]=ff;
dfs(ff);
if(l[x]>l[ff])
l[x]=l[ff];
if(l[ff]>=lv[x])
{
nr++;
while(!(s1[ns]==x && s2[ns]==ff))
{
S[nr].push_back(s1[ns]);
S[nr].push_back(s2[ns]);
--ns;
}
S[nr].push_back(s1[ns]);
S[nr].push_back(s2[ns]);
--ns;
}
}
else
{
if(par[x]!=ff && lv[ff]<lv[x])
{
if(l[x]>lv[ff])
l[x]=lv[ff];
ns++;
s1[ns]=x;
s2[ns]=ff;
}
}
}
}
void afis()
{
printf("%d\n",nr);
int i,j;
for(i=1;i<=nr;i++)
{
sort(S[i].begin(),S[i].end());
for(j=0;j<S[i].size();++j)
if((j>0 && S[i][j-1]!=S[i][j])||(j==0))
printf("%d ",S[i][j]);
printf("\n");
}
}
int main()
{
citire();
int i,j;
/*for(i=1;i<=n;++i)
{
for(j=0;j<G[i].size();++j)
printf("%d ",G[i][j]);
printf("\n");
}*/
nr=0; i=1;
dfs(1);
/*for(i=1;i<=n;i++)
if(!viz[i])
{
nr++;
dfs(i);
}
for(i=1;i<=n;i++)
printf("%d ",lv[i]);
printf("\n");*/
afis();
return 0;
}