Pagini recente » Cod sursa (job #2330512) | Cod sursa (job #569218) | Cod sursa (job #1222721) | Cod sursa (job #778488) | Cod sursa (job #2677358)
#include <bits/stdc++.h>
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
const int NMAX=100005;
int n,m,x,y;
vector<int>v[NMAX];
vector<int>disc,low;
vector<vector<int>>c;
stack<pair<int,int>>s;
void articulation_point(int x,int y)
{
int tx,ty;
vector<int>connected;
//toti copiii lui din stiva fac parte din componenta coenxa
while(tx!=x || ty!=y)
{
tx=s.top().first;
ty=s.top().second;
s.pop();
connected.push_back(tx);
connected.push_back(ty);
}
c.push_back(connected);
}
void dfs(int x,int parent,int k)
{
disc[x]=low[x]=k;
for(int i=0; i<v[x].size(); i++)
{
if(v[x][i]!=parent && disc[v[x][i]]==-1)
{
//pun muchia pe care ma duc in stiva
s.push({x,v[x][i]});
dfs(v[x][i],x,k+1);
//dfs pe vecinul ales
//daca copiii lui x au putut sa ajunga intr-un nod doar printr-o muchie de intoarcere
//deci si x poate
low[x]=min(low[x],low[v[x][i]]);
if(low[v[x][i]]>=disc[x])//conditia ca x sa fie punct de articulatie
articulation_point(x,v[x][i]);
}
else if(disc[v[x][i]]!=-1) //nodul e deja vizitat,deci avem o muchie de intoarcere
low[x]=min(low[x],disc[v[x][i]]);
}
}
int main()
{
f>>n>>m;
for(int i=1; i<=m; i++)
{
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
disc=vector<int>(n+5,-1);//disc[x] reprezinta al catelea nod din parcurgere este x
low=vector<int>(n+5);//low[x] cel mai de sus stramos la care se poate ajunge direct printr-o muchie de intoarcere
dfs(1,0,0);
g<<c.size()<<"\n";
for(int i=0; i<c.size(); i++)
{
sort(c[i].begin(),c[i].end());
c[i].erase(unique(c[i].begin(),c[i].end()),c[i].end());
for(int j=0; j<c[i].size(); j++)
g<<c[i][j]<<" ";
g<<"\n";
}
return 0;
}