答案上界为该无向图中的偶点数量,可以通过构造使得答案达到上界
所以答案就是偶点数量
可是还要输出方案,可以创造一个虚点与所有奇点连边,这样一来就可以跑欧拉路
顺便答案是n-奇点个数
Code:
#include <bits/stdc++.h>
#define maxn 210
using namespace std;
set <int> edge[maxn];
int n, m;
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
void dfs(int u){
if (edge[u].empty()) return;
int v = *edge[u].begin();
edge[u].erase(v); edge[v].erase(u);
if (u != n + 1 && v != n + 1) printf("%d %d\n", u, v);
dfs(v);
}
int main(){
int M = read();
while (M--){
n = read(), m = read();
for (int i = 0; i < maxn; ++i) edge[i].clear();
for (int i = 1; i <= m; ++i){
int u = read(), v = read();
edge[u].insert(v); edge[v].insert(u);
}
for (int i = 1; i <= n; ++i)
if (edge[i].size() & 1) edge[i].insert(n + 1), edge[n + 1].insert(i);
printf("%d\n", n - edge[n + 1].size());
for (int i = 1; i <= n; ++i)
while (!edge[i].empty()) dfs(i);
}
return 0;
}