Pagini recente » Cod sursa (job #652226) | Cod sursa (job #16675) | Cod sursa (job #2886530) | Cod sursa (job #2391229) | Cod sursa (job #1835957)
#include <cstdio>
#include <vector>
#include <bitset>
#include <stack>
#define Nmax 100010
using namespace std;
vector <int > G[Nmax];
bitset <Nmax> viz;
stack <int> stiva;
vector < vector < int > > solutie;
int niv[Nmax],inalt_max[Nmax];
int n,m,nr;
void read()
{
freopen("biconex.in","r",stdin);
freopen("biconex.out","w",stdout);
scanf("%d %d",&n,&m);
int x,y;
for(int i = 0 ; i < m ; i++)
{
scanf("%d %d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
}
void formare(int x , int tata)
{
vector <int> aux ;
aux.push_back(tata);
while( !stiva.empty() && stiva.top() != x)
{
int stop = stiva.top();
aux.push_back(stop);
stiva.pop();
}
aux.push_back(x);
stiva.pop();
solutie.push_back(aux);
}
void afisare()
{
for(int i = 0 ; i < solutie.size() ; i++)
{
for(vector <int> :: iterator it = solutie[i].begin() ; it != solutie[i].end() ; it++)
printf("%d ",*it);
printf(" nr de elemente %d \n",solutie[i].size());
}
}
void dfs(int x , int t)
{
viz[x] = true;
niv[x] = niv[t]+1;
inalt_max[x] = niv[x];
vector <int> :: iterator it;
for( it = G[x].begin(); it != G[x].end() ; it++)
{
if(*it == t)
continue;
if(viz[*it] == false)
{
stiva.push(*it);
dfs(*it,x);
inalt_max[x] = min(inalt_max[*it],inalt_max[x]);
if(inalt_max[*it] >= niv[x])
{
formare(*it,x);
nr++;
}
}
else
{
inalt_max[x] = min(niv[*it],inalt_max[x]);
}
}
}
int main()
{
read();
niv[0] = -1;
for(int i = 1 ; i <= n ; i++)
{
if(viz[i] == false)
dfs(i,0);
}
printf("%d\n",nr);
afisare();
return 0;
}