洛谷-T103489 【模板】边双连通分量
【模板】边双连通分量
边双的数量
tarjan 割边
出现一个桥就会把分割出一个连通块,因此边双的数量就是 桥的数量 + 原本块的数量
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 6e5 + 10;
int head[maxn], nexx[maxn], to[maxn], vp = 1;
int low[maxn], dfn[maxn], tp = 0, ans = 0;
inline void add(int u, int v)
{
vp++;
nexx[vp] = head[u];
to[vp] = v;
head[u] = vp;
}
void tarjan(int now, int pre)
{
low[now] = dfn[now] = ++tp;
for(int i=head[now]; i; i=nexx[i])
{
int nex = to[i];
if(dfn[nex] == 0)
{
tarjan(nex, i);
low[now] = min(low[nex], low[now]);
if(low[nex] > dfn[now])
ans++;
}
else if(i != (pre ^ 1))
low[now] = min(low[now], dfn[nex]);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
while(m--)
{
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
for(int i=1; i<=n; i++)
{
if(dfn[i] == 0)
{
ans++;
tarjan(i, -1);
}
}
cout << ans << endl;
return 0;
}