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

猜你喜欢

转载自blog.csdn.net/ujn20161222/article/details/80316081