# E. Cyclic Components+图环

E. Cyclic Components
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

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.

There are 6
connected components, 2 of them are cycles: [7,10,16] and [5,11,9,15]
.
Input

The first line contains two integer numbers n

and m (1n2105, 0m2105

) — number of vertices and edges.

The following m

lines contains edges: edge i is given as a pair of vertices vi, ui (1vi,uin, uivi). 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.

Output

Print one integer — the number of connected components which are also cycles.

Examples
Input
Copy
5 4
1 2
3 4
5 4
3 5

Output
Copy
1

Input
Copy
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
Copy
2

Note

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;
}


• 评论

• 下一篇
• 上一篇