环的定义
环的定义是在路径的定义的基础上做了一定的拓展,首尾相接的路径我们就把它叫做一个环。同样我们也有简单环,也就是除开首尾以外,剩下的部分不会经过重复的点的环就叫做简单环。
这个题就是判断图中简单环的数量,由此我们可以得知在无向图中的简单环,其实就是每个点的入度为2,因此我们可以利用这个方法来求环的数目。(当时居然没想到入度和出度QAQ)
注意此处不能用拓扑排序的原因是拓扑排序只能判断有无环,不能判断是不是只有环
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define rec(n) for(int i=1;i<=n;i++)
//#define double long double
using namespace std;
const int N=5e5+10,mol=1e18;
int h[N],e[N],ne[N],idx,st[N],w[N];
typedef pair<int,int>PII;
map<PII,int>ms;
//bool st[10][10];
void add(int a,int b)
{
ne[idx]=h[a];e[idx]=b;
h[a]=idx++;
w[b]++;
}int f=1;
void dfs(int a)
{
if(w[a]!=2)
{
f=0;
return ;
}
st[a]=1;
for(int i=h[a];i!=-1;i=ne[i])
{
int j=e[i];
if(!st[j])dfs(j);
}
return ;
}
void sove(){
memset(h,-1,sizeof h);
int n,m;
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(!st[i])
{f=1;
dfs(i);
if(f)sum++;
}
}
cout<<sum;
}
signed main()
{
// std::ios::sync_with_stdio(false);
// std::cin.tie(0);
// std::cout.tie(0);
//rand();
//srand((unsigned)time(NULL));
int t=1;
//cin>>t;
while(t--)sove();
}