zoukankan      html  css  js  c++  java
  • [CF788B] Weird journey

    [CF788B] Weird journey - 欧拉回路

    Description

    总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。

    Solution

    相当于每条边克隆一份,然后再删掉两条不是同源的边,然后代入欧拉路条件

    因此贡献有三种:两条边,一条边一个自环,两个自环

    (这里说的边不包含自环)

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    const int N = 1e6 + 5;
    int n, m, d[N], c, vis[N], sum;
    
    vector<int> g[N];
    
    void dfs(int p)
    {
        ++sum;
        vis[p] = 1;
        for (int q : g[p])
        {
            if (vis[q] == 0)
                dfs(q);
        }
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        cin >> n >> m;
    
        unordered_set<int> s;
        for (int i = 1; i <= m; i++)
        {
            int u, v;
            cin >> u >> v;
            s.insert(u);
            s.insert(v);
            if (u == v)
            {
                ++c;
                continue;
            }
            g[u].push_back(v);
            g[v].push_back(u);
            d[u]++;
            d[v]++;
        }
    
        dfs(*s.begin());
        if (sum < s.size())
        {
            cout << 0 << endl;
            return 0;
        }
    
        int ans = 0;
        for (int i = 1; i <= n; i++)
            if (d[i])
                ans += (d[i] - 1) * d[i] / 2;
        ans += c * (m - c);
        if (c)
            ans += c * (c - 1) / 2;
        cout << ans << endl;
    }
    
  • 相关阅读:
    如何实现多个异步同步执行?
    Treap学习笔记
    实验
    bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)
    [SCOI2007]最大土地面积(旋转卡壳)
    Splay学习笔记
    计算几何学习笔记
    [CQOI2006]凸多边形(半平面交)
    大数的乘法(C++)
    商人过河问题(DFS)
  • 原文地址:https://www.cnblogs.com/mollnn/p/14638913.html
Copyright © 2011-2022 走看看