欧拉回路
我们发现本质上就是加最少的边使得整个图可以分解成若干欧拉回路
那么我们对于每个联通快单独求解
如果已经是欧拉回路单独计算
其他的按照欧拉回路计算公式补全边数即可
#include <bits/stdc++.h> using namespace std; const int maxn = 1005; int fa[maxn], d[maxn], vis[maxn], sum[maxn]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int n, ans, a; int main() { scanf("%d", &n); for(int i = 1; i < maxn; ++i) fa[i] = i; for(int i = 1; i <= n; ++i) { int x, y; scanf("%d%d", &x, &y); ++d[x]; --d[y]; vis[x] = vis[y] = 1; fa[find(x)] = find(y); } for(int i = 1; i < maxn; ++i) if(vis[i]) sum[find(i)] += abs(d[i]); for(int i = 1; i < maxn; ++i) if(vis[i] && find(i) == i) { if(sum[i] == 0) ++a; else ans += sum[i]; } printf("%d\n", ans / 2 + n + a); return 0; }
原文:https://www.cnblogs.com/19992147orz/p/11488710.html