Pagini recente » Cod sursa (job #2738689) | Cod sursa (job #965148) | Cod sursa (job #3274506) | Cod sursa (job #3292204) | Cod sursa (job #2738976)
#include <bits/stdc++.h>
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
vector<int>v[100100],SOL[100100];
vector < pair < int , int > > sol;
stack < pair < int , int > > st;
int nr_comp,nr_rad,A[100100],fv[100100],viz[100100],ant[100100],h[100100],tata[100100];
void puncte_articulatie(int nod)
{
viz[nod]=1;
ant[nod]=h[nod];
for(int i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i];
if(viz[vecin]==0)
{
if(nod==1)nr_rad++;
h[vecin]=h[nod]+1;
tata[vecin]=nod;
puncte_articulatie(vecin);
ant[nod]=min(ant[nod],ant[vecin]);
if(ant[vecin]>=h[nod])fv[nod]=1;
}
else if(tata[nod]!=vecin && h[vecin]<ant[nod])ant[nod]=h[vecin];
}
}
void muchii_critice(int nod)
{
viz[nod]=1;
ant[nod]=h[nod];
for(int i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i];
if(viz[vecin]==0)
{
h[vecin]=h[nod]+1;
tata[vecin]=nod;
muchii_critice(vecin);
ant[nod]=min(ant[nod],ant[vecin]);
if(ant[vecin]>h[nod])
{
sol.push_back({nod,vecin});
}
}
else if(tata[nod]!=vecin && h[vecin]<ant[nod])ant[nod]=h[vecin];
}
}
void componente_biconexe(int nod)
{
viz[nod]=1;
ant[nod]=h[nod];
for(int i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i];
if(viz[vecin]==0)
{
st.push({nod,vecin});
h[vecin]=h[nod]+1;
tata[vecin]=nod;
componente_biconexe(vecin);
ant[nod]=min(ant[nod],ant[vecin]);
if(ant[vecin]>=h[nod])
{
nr_comp++;
int m=0;
while(!(st.top().first==nod && st.top().second==vecin))
{
m++;A[m]=st.top().first;
m++;A[m]=st.top().second;
st.pop();
}
m++;A[m]=st.top().first;
m++;A[m]=st.top().second;
st.pop();
sort(A+1,A+m+1);
for(int j=1;j<=m;j++)
if(A[j]!=A[j-1])SOL[nr_comp].push_back(A[j]);
}
}
else if(tata[nod]!=vecin && h[vecin]<ant[nod])ant[nod]=h[vecin];
}
}
int c,m,n,j,x,y,i,ans;
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
if(c==2)
{
puncte_articulatie(1);
if(nr_rad>=2)fv[1]=1;
else fv[1]=0;
for(i=1;i<=n;i++)if(fv[i]==1)ans++;
g<<ans<<'\n';
for(i=1;i<=n;i++)
if(fv[i]==1)g<<i<<" ";
}
else if(c==3)
{
muchii_critice(1);
g<<sol.size()<<'\n';
for(i=0;i<sol.size();i++)
g<<sol[i].first<<" "<<sol[i].second<<'\n';
}
else
{
componente_biconexe(1);
g<<nr_comp<<'\n';
for(i=1;i<=nr_comp;i++)
{
for(j=0;j<SOL[i].size();j++)
g<<SOL[i][j]<<" ";
g<<'\n';
}
}
return 0;
}