You are given an undirected graph consisting of n
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
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.
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.
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.
The first line contains two integer numbers n
) — number of vertices and edges.
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.
Print one integer — the number of connected components which are also cycles.
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.
The illustration above corresponds to the second example.
#define happy #include<bits/stdc++.h> using namespace std; #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define all(a) (a).begin(),(a).end() #define pll pair<ll,ll> #define vi vector<int> #define pb push_back ll rd(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int N=2e5+10; const int M=4e5+10; int cntcol; int col[N],sz[N],dcol[N]; int to[M],nxt[M],p[N],d[N]; void dfs(int x,int co){ col[x]=co;sz[co]++; if(d[x]==2)dcol[co]++; for(int i=p[x];i!=-1;i=nxt[i]) if(!col[to[i]]) dfs(to[i],co); } int main(){ #ifdef happy freopen("in.txt","r",stdin); #endif int n=rd(),m=rd(); memset(p,-1,sizeof(p)); rep(i,1,m){ int u=rd(),v=rd(); to[i*2-1]=v,nxt[i*2-1]=p[u],p[u]=2*i-1; to[i*2]=u,nxt[i*2]=p[v],p[v]=2*i; d[v]++,d[u]++; } rep(i,1,n){ if(!col[i]){ dfs(i,++cntcol); // cout<<i<<endl; } } int ans=0; rep(i,1,cntcol)ans+=(dcol[i]==sz[i]); printf("%d\n",ans); return 0; }