Pagini recente » Cod sursa (job #1509216) | Cod sursa (job #407539) | Cod sursa (job #217176) | Cod sursa (job #1884811) | Cod sursa (job #3217179)
#include <bits/stdc++.h>
#define SIZE 100005
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
int n,m,k,vf,niv[SIZE],st[SIZE],up[SIZE];
// up[x] reprezinta cel mai de sus nod la care se poate ajunge din x
vector<int>a[SIZE],sol[SIZE];
void dfs_tree(int x)
{
st[++vf]=x;
up[x]=niv[x];
for(auto u:a[x])
if(niv[u]!=0)up[x]=min(up[x],niv[u]);
else
{
niv[u]=niv[x]+1;
dfs_tree(u);
up[x]=min(up[x],up[u]);
if(up[u]>=niv[x])
{
k++;
while(st[vf]!=u)
sol[k].push_back(st[vf--]);
sol[k].push_back(st[vf--]);
sol[k].push_back(x);
}
}
}
int main()
{
int i,x,y;
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
for(i=1;i<=n;i++)
if(niv[i]==0)
{
niv[i]=1;
dfs_tree(i);
}
g<<k<<'\n';
for(i=1;i<=k;i++)
{
for(auto u:sol[i])g<<u<<' ';
g<<'\n';
}
}