先求连通块,再看是不是所有连通块的点的度数为2,如果是那就是简单环,只不过我觉得我这个代码时间复杂度还是挺高的,虽然这题没啥问题,不过我看有他人是一遍用dfs找环,一遍判断找到环时的那个点的度数是不是2。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int n,m,vis[maxn];
vector<int>v;
vector<int>g[maxn];
void dfs(int x){
vis[x]=1;
v.push_back(x);
for(int i=0;i<g[x].size();i++){
int v=g[x][i];
if(!vis[v])dfs(v);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
int ans=0;
for(int i=1;i<=n;i++){
v.clear();
if(!vis[i]){
dfs(i);
bool flag=true;
for(int i=0;i<v.size();i++){
if(g[v[i]].size()!=2)flag=false;
}
if(flag)ans++;
}
}
cout<<ans<<endl;
}