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.

并查集判断几个环There are [5,11,9,15] .

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

Input
5 4
1 2
3 4
5 4
3 5
Output
1
Input
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
Output
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);
}

 

相关文章:

  • 2022-12-23
  • 2021-09-14
  • 2021-06-18
  • 2022-03-05
  • 2021-06-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-08
  • 2022-12-23
相关资源
相似解决方案