Pagini recente » Cod sursa (job #2319843) | Cod sursa (job #1629048) | Cod sursa (job #2999741) | Cod sursa (job #1874633) | Cod sursa (job #3041832)
#include <bits/stdc++.h>
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
int viz[100005];
stack <pair <int,int>> deq;
vector <int> sal[100005];
vector <int> v[100005];
int l[100005],niv[100005],nrcomp,tata[100005];
void dfs(int x,int nivel)
{
viz[x]=1;
l[x]=nivel;
niv[x]=nivel;
for (int i=0;i<v[x].size();i++)
{
int nod = v[x][i];
if (viz[nod]==0)
{
deq.push({x,nod});
tata[nod]=x;
dfs(nod,nivel+1);
if (l[x]>=l[nod])
{
l[x]=l[nod];
}
if (l[nod]>=niv[x])
{
if (deq.empty())
{
continue;
}
nrcomp++;
while (1)
{
auto acum = deq.top();
sal[nrcomp].push_back(acum.first);
sal[nrcomp].push_back(acum.second);
deq.pop();
if (acum.first==x||acum.second==x)
{
break;
}
}
}
}
else
{
if (nod!=tata[x] && l[x]>niv[nod])
{
l[x] = niv[nod];
}
}
}
}
int n,m,i;
int main()
{
f>>n>>m;
for (i=1;i<=m;i++)
{
int x,y;
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for (i=1;i<=n;i++)
{
if (viz[i]==0)
{
dfs(i,0);
}
}
g<<nrcomp<<'\n';
for (i=1;i<=nrcomp;i++)
{
sort (sal[i].begin(),sal[i].end());
g<<sal[i][0]<<" ";
for (int j=1;j<sal[i].size();j++)
{
int nod = sal[i][j];
if (sal[i][j]!=sal[i][j-1])
{
g<<sal[i][j]<<" ";
}
}
g<<'\n';
}
return 0;
}