题解:这一题的难点在于判断图的每个联通分块里有多少条路构成不了欧拉路,那么需要根据欧拉路的性质可知,对于无向图,构成欧拉路的奇数点的个数为0或者为2,那么我们只要统计出这个联通分块的(奇数点的个数-2)就是多余出来的那些点,那么直接累加(奇数点的个数-2)/2即可,代码里有更详细的说明。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int fa[100005];
int a[100005];
int od[100005];
void init(int n)
{
for(int i = 1; i <= n; i++)
{
fa[i] = i;
a[i] = 0;
od[i] = 0;
}
}
int find(int x)
{
if (x == fa[x])
return x;
return fa[x] = find(fa[x]);
}
int main()
{
int t;
int x, y;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
init(n);
for (int i = 0; i < m; i++)
{
scanf("%d%d", &x, &y);
a[x]++;
a[y]++;
int fx = find(x);
int fy = find(y);
if (fx != fy)
fa[fx] = fy;
}
int ans = -1;
for (int i = 1; i <= n; i++)
{
if (a[i])
{
if (fa[i] == i)
ans++;
if (a[i] & 1)
{
od[find(i)]++;
}
}
}
for (int i = 1; i<=n; i++)
{
ans += max(0, (od[i] - 2) / 2);
}
printf("%d\n", ans);
}
}