码迷,mamicode.com
首页 > 其他好文 > 详细

[CF788B] Weird journey - 欧拉回路

时间:2021-04-10 13:19:55      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:begin   不包含   一个   esc   cin   不同的   lang   不同   欧拉   

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

[CF788B] Weird journey - 欧拉回路

标签:begin   不包含   一个   esc   cin   不同的   lang   不同   欧拉   

原文地址:https://www.cnblogs.com/mollnn/p/14638913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!