一个环中,可以保证每个节点的度数为2
我们可以以样例为例,不难看出如果若干个节点可以构成一个环,那么这几个节点的度数必定为2
所以我们可以先进行vector邻接表存图(常规操作)
再通过dfs遍历该图,遍历的时候注意统计节点的度数(即ve[node].size())
若度数不为2,说明与该节点所连的所有节点都不能构成环,则需要建立一个标记,
使其在最后结算的时候不用加上这个节点所能连通到的所有节点
vis[]数组用来记录哪些点被访问过了,被访问过的节点之后就可以不用重复访问了
#include<stdio.h>
#include<vector>
using namespace std;
vector<int>ve[200005];
bool vis[200005];
bool flag=1;
void build(int a,int b)///存无向图
{
ve[a].push_back(b);
ve[b].push_back(a);
}
void dfs(int node)
{
int big=ve[node].size();
if(big!=2)
{
flag=0;
}
for(int i=0; i<big; i++)
{
if(!vis[ve[node][i]])
{
vis[ve[node][i]]=1;
dfs(ve[node][i]);
}
}
}
int main()
{
int n,m,ans=0;
scanf("%d%d",&n,&m);
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
build(a,b);
}
for(int i=1; i<=n; i++)
{
if(vis[i]==0)
{
dfs(i);
if(flag==1) ans++;///结算
else flag=1;///如果flag==0,则跳过ans++,再更新ans的值
}
}
printf("%d\n",ans);
return 0;
}