标签:begin 不包含 一个 esc cin 不同的 lang 不同 欧拉
总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。
相当于每条边克隆一份,然后再删掉两条不是同源的边,然后代入欧拉路条件
因此贡献有三种:两条边,一条边一个自环,两个自环
(这里说的边不包含自环)
#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;
}
标签:begin 不包含 一个 esc cin 不同的 lang 不同 欧拉
原文地址:https://www.cnblogs.com/mollnn/p/14638913.html