Cod sursa(job #2085648)
Utilizator | Data | 10 decembrie 2017 15:24:43 | |
---|---|---|---|
Problema | Componente biconexe | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.61 kb |
#include<fstream>
#include<cmath>
#include<iostream>
#define DN 100005
#include<vector>
#include<cctype>
#include<cstring>
#include<stack>
#define pb push_back
using namespace std;
ifstream fin("biconex.in");
ofstream fout("biconex.out");
int n,low[DN],niv[DN],f,g,m,rez,nr;
vector<int>v[DN];
vector<int>r[DN];
stack<int>s;
void dfs(int nod,int f)
{
low[nod]=niv[nod];
s.push(nod);
for(auto i:v[nod])
if(i!=f)
{
if(niv[i]>0)
low[nod]=min(low[nod],niv[i]);
else
{
niv[i]=niv[nod]+1;
dfs(i,nod);
low[nod]=min(low[nod],low[i]);
if(low[i]>=niv[nod])
{
rez++;
r[rez].pb(nod);
while(1)
{
r[rez].pb(s.top());
if(s.top()==i)
{
s.pop();
break;
}
s.pop();
}
}
}
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>f>>g;
v[f].pb(g);
v[g].pb(f);
}
for(int i=1;i<=n;i++)
if(niv[i]==0)
{
niv[i]=1;
dfs(i,0);
}
fout<<rez<<'\n';
for(int i=1;i<=rez;i++)
{
for(auto j:r[i])
fout<<j<<' ';
fout<<'\n';
}
}