题目链接
解析
给你一张图,你能最少几笔画完整张图?
不同的连通块,就有一个,若该连通块是欧拉回路,就一笔画完;则画度数为奇数的点的一半的笔画,
代码
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstring>
#include<cstdlib>
#include<vector>
#include <algorithm>
const int maxn = 100000+10;
using namespace std;
typedef long long LL;
using namespace std;
int deg[maxn];
int fa[maxn];
int Find(int x) {
return fa[x] == x?x:fa[x]=Find(fa[x]);
}
int vis[maxn];
int odd[maxn];
vector<int>p;
int main() {
int n, m;
while (~scanf("%d%d", &n, &m)) {
memset(deg, 0, sizeof(deg));
p.clear();
for (int i=1; i<=n; i++)
fa[i] = i, vis[i] = 0, odd[i] = 0;
for (int i=1; i<=m; i++) {
int u, v;
scanf("%d%d", &u, &v);
deg[u]++;
deg[v]++;
u = Find(u);
v = Find(v);
if (u != v)
fa[u] = v;
}
int res = 0;
for (int i=1; i<=n; i++) {
int f = Find(i);
if (!vis[f]) {
p.push_back(f);
vis[f]=1;
}
if (deg[i]%2 == 1)
odd[f]++;
}
for (int i=0; i<p.size(); i++) {
int u = p[i];
if (deg[u] == 0)
continue;
if (odd[u] == 0)
res++;
else
res += odd[u]/2;
}
printf("%d\n", res);
}
return 0;
}