題目鏈接
解析
給你一張圖,你能最少幾筆畫完整張圖?
不同的連通塊,就有一個,若該連通塊是歐拉回路,就一筆畫完;則畫度數爲奇數的點的一半的筆畫,
代碼
#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;
}