Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)

Posted lr599909928

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)相关的知识,希望对你有一定的参考价值。

技术图片

  • 题意:给你(n)个顶点和(m)条边,问它们有多少个单环(无杂环),例如图中第二个就是一个杂环.

  • 题解:不难发现,如果某几个点能够构成单环,那么每个点一定只能连两条边.所以我们先构建邻接表,然后从某个数开始跑dfs,如果这一边所有点的度数都为(2),那么就能构成一个单环.

  • 代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<long,long> PLL;
     
    int n,m;
    int u,v;
    bool st[N];
    bool ok=1;
    vector<int> V[N];
     
    void dfs(int x){
        st[x]=true;
        if(V[x].size()!=2) ok=0;
     
        for(auto w:V[x]){
            if(!st[w]) dfs(w);
        }
    }
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
        cin>>n>>m;
         while(m--){
            cin>>u>>v;
             V[u].pb(v);
             V[v].pb(u);
         }
         int ans=0;
         for(int i=1;i<=n;++i){
             ok=1;
             if(!st[i]){
                 dfs(i);
                 if(ok) ans++;
             }
         }
     
        printf("%d
    ",ans);
     
    
        return 0;
    }
    

以上是关于Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #479 (Div. 3)题解

Codeforces Round #479 (Div. 3) 题解

Codeforces Round #479 (Div. 3)解题报告

[CF977X]Codeforces Round #479 (Div. 3)

Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)

Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two