Pagini recente » Cod sursa (job #2380304) | Cod sursa (job #3262645) | Cod sursa (job #1260655) | Cod sursa (job #2806152) | Cod sursa (job #1265169)
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <bitset>
using namespace std;
ifstream is("dfs.in");
ofstream os("dfs.out");
const int Dim = 1e6 + 1;
int n, m;
vector<int> G[Dim];
int T[Dim], niv[Dim], L[Dim];
bitset S;
pair<int, int> ST[Dim], p;
int sp, K; // stack pointer, nr comp conexe
set<int> comp[Dim];
void Read();
void Dfs(int x);
void Write();
int main()
{
Read();
Dfs(1);
os << K + 1 << '\n';
os.close();
return 0;
}
void Read()
{
is >> n >> m;
int x, y;
S.resize(n+1);
for( int i = 1; i <= n; ++i )
{
is >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
is.close();
}
void Dfs(int x)
{
S[x] = true;
L[x] = niv[x];
for (vector<int>::iterator it = G[x].begin(); it != G[x].end(); ++it)
if (!S[*it])
{
T[*it] = x;
niv[*it] = niv[x] + 1;
ST[++sp] = make_pair(x, *it);
Dfs(*it);
if (L[*it] >= niv[x])
{
++K;
while (true)
{
p = ST[sp--];
comp[K].insert(p.first);
comp[K].insert(p.second);
if ( p.first == x && p.second == *it)
break;
}
}
L[x] = min(L[x], L[*it]);
}
else
if ( *it != T[x] ) //back edge
L[x] = min(L[x], niv[*it]);
}