You are given an undirected graph consisting of m edges. Your task is to find the number of connected components which are cycles.
Here are some definitions of graph theory.
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 ). An edge can't connect vertex with itself, there is at most one edge between a pair of vertices.
Two vertices v .
A connected component is a cycle if and only if its vertices can be reordered in such a way that:
- the first vertex is connected with the second vertex by an edge,
- the second vertex is connected with the third vertex by an edge,
- ...
- the last vertex is connected with the first vertex by an edge,
- all the described edges of a cycle are distinct.
A cycle doesn't contain any other edges except described above. By definition any cycle contains three or more vertices.
Input
The first line contains two integer numbers 0≤m≤2⋅105 ) — number of vertices and edges.
The following ui,vi ) in the list of edges.
Output
Print one integer — the number of connected components which are also cycles.
Examples
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
Note
In the first example only component [3,4,5] is also a cycle.
The illustration above corresponds to the second example.
大意:找出有多少个环
思路:算出每个顶点的度,只有度等于2的情况下才能成为环。如果两个顶点的度都为2,使用并查集,如果父节点相同,答案加一,否则联立。
AC代码:
#include<cstdio> #include <map> #include<iostream> #include<string> #include<cstring> #include<cmath> #include<algorithm> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;} typedef long long ll; const int maxn=5e5+10; int f[maxn]; int sum[maxn]; int ans; struct node{ int u,v; }a[maxn]; int find(int x){ if(f[x]==x){ return x; } else{ return f[x]=find(f[x]); } } void unio(int x,int y){ int f1=find(x); int f2=find(y); if(f1!=f2){ f[f1]=f2; } else ans++; } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ f[i]=i; } ans=0; for(int i=0;i<m;i++){ cin>>a[i].u>>a[i].v; sum[a[i].u]++; sum[a[i].v]++; } for(int i=0;i<m;i++){ if(sum[a[i].u]==2&&sum[a[i].v]==2){ unio(a[i].u,a[i].v); } } printf("%d",ans); }