Pagini recente » Cod sursa (job #2074452) | Cod sursa (job #3245146) | Cod sursa (job #2445622) | Cod sursa (job #2883919) | Cod sursa (job #2963286)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
int n,m;
const int N=1e5+3;
vector<int>a[N];
int viz[N],nivel[N],up[N];
vector<int>que;
vector<vector<int>>componente;
void dfs(int nod,int tata)
{
viz[nod]=1;
nivel[nod]=nivel[tata]+1;
up[nod]=nivel[nod];
que.push_back(nod);
for(auto it: a[nod])
if(it!=tata)
{
if(viz[it])
up[nod]=min(up[nod],nivel[it]);
else
{
dfs(it,nod);
up[nod]=min(up[nod],up[it]);
if(up[it]>=nivel[nod])
{
componente.push_back(vector<int>());
while(que.back()!=it)
{
componente[componente.size()-1].push_back(que.back());
que.pop_back();
}
que.pop_back();
componente[componente.size()-1].push_back(nod);
componente[componente.size()-1].push_back(it);
}
}
}
}
int main()
{
f>>n>>m;
for(int i=1; i<=m; i++)
{
int X,Y;
f>>X>>Y;
a[X].push_back(Y);
a[Y].push_back(X);
}
dfs(1,0);
g<<componente.size()<<'\n';
for(auto i : componente)
{
for(auto j: i)
g<<j<<" ";
g<<'\n';
}
return 0;
}