Cod sursa(job #928871)
#include<fstream>
#include<vector>
#include<utility>
#define f first
#define s second
#define NMAX 100010
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
int n, m, nr=0, comp=0, dfn[NMAX], low[NMAX];
vector<int> v[NMAX];
vector< pair<int,int> > a[NMAX];
void Citeste()
{
int i, x, y;
f>>n>>m;
for (i=1; i<=m; ++i)
{
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
}
void Biconex(int nod, int tata)
{
int i, x;
dfn[nod]=low[nod]=++nr;
for (i=0; i<v[nod].size(); ++i)
{
x=v[nod][i];
if (x!=tata && dfn[x]<dfn[nod])
{
a[comp].push_back( make_pair(x, nod) );
}
if (!dfn[x])
{
Biconex(x, nod);
low[nod]=min(low[nod], low[x]);
if (low[x]>=dfn[nod])
{
++comp;
}
}
else
if (x!=tata) low[nod]=min(low[nod], dfn[x]);
}
}
void Scrie()
{
g<<comp<<"\n";
}
int main()
{
Citeste();
Biconex(1, -1);
Scrie();
f.close();
g.close();
return 0;
}