You are given an undirected graph consisting of n vertices and m edges. Your task is to find the number of connected components which are cycles.node
Here are some definitions of graph theory.web
An undirected graph consists of two sets: set of nodes (called vertices) and set of edges. Each edge connects a pair of vertices. All edges are bidirectional (i.e. if a vertex a is connected with a vertex b, a vertex b is also connected with a vertex a). An edge can't connect vertex with itself, there is at most one edge between a pair of vertices.ide
Two vertices u and v belong to the same connected component if and only if there is at least one path along edges connecting u and v.ui
A connected component is a cycle if and only if its vertices can be reordered in such a way that:url
A cycle doesn't contain any other edges except described above. By definition any cycle contains three or more vertices.spa
The first line contains two integer numbers n and m (1≤n≤2⋅105, 0≤m≤2⋅105) — number of vertices and edges.code
The following m lines contains edges: edge i is given as a pair of vertices vi, ui (1≤vi,ui≤n, ui≠vi). There is no multiple edges in the given graph, i.e. for each pair (vi,ui) there no other pairs (vi,ui) and (ui,vi) in the list of edges.component
Print one integer — the number of connected components which are also cycles.orm
5 4 1 2 3 4 5 4 3 5
1
17 15 1 8 1 12 5 11 11 9 9 15 15 5 4 13 3 13 4 3 10 16 7 10 16 7 14 3 14 4 17 6
2
In the first example only component [3,4,5] is also a cycle.xml
The illustration above corresponds to the second example.
給n個點,m條無向邊,找有幾個環。(定義:t個點,t條邊,首尾依次相接,不含有其餘邊,圍成個圈)
網上的思路:利用並查集查找環的個數
個人思路:dfs判環,稍加修飾——
加個記憶化操做:顯然每一個點要麼是一個環上的一點,要麼不是;
一、當這個點的度數不爲2,必定不是
二、當這個點的鄰點不是,必定不是
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m,du[N],f[N];bool vis[N];
vector<int> e[N];
inline void Init(){
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
du[x]++;du[y]++;
}
}
int dfs(int x,int fa){
int &now=f[x];
if(~now) return now;
now=1;
if(du[x]!=2) return now=0;
if(vis[x]) return now=1;
vis[x]=1;
for(int i=0;i<e[x].size();i++){
int v=e[x][i];
if(x!=fa) now&=dfs(v,x);
if(!now) return now;
}
return now;
}
inline void Solve(){
memset(f,-1,sizeof f);
int ans=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
if(dfs(i,0)){
ans++;
}
}
}
printf("%d\n",ans);
}
int main(){
Init();
Solve();
return 0;
}