本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2022-10-02 08:29:02
题解思路:
当节点数是奇数的时候,连通块内一定会有一个是奇数个点,所以一定无解。
那么节点数是偶数的时候,我们对于每条边来说,当他连着的部分有奇数个点,那么这条边一定不能删,若都是偶数个点,那么就要删掉。
那么我们就一遍 dfs 判断他们两边的点的个数来判断删或不删就可以了。
AC CODE:
#include <bits\/stdc++.h>
using namespace std;
const int N = 100010, M = N * 2;
int n;
int ans;\/\/表示一共可以删除多少条边
int h[N], e[M], ne[M], idx;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u, int fa) {
int sz = 1;
for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
if (j != fa) {
int s = dfs(j, u);
if (!(s & 1)) ans++;\/\/是偶数个点,那么就可以删
sz += s;\/\/统计长度
}
}
return sz;
}
int main() {
scanf("%d", &n);
if (n & 1) {\/\/无解
puts("-1");
return 0;
}
memset(h, -1, sizeof(h));
for (int i = 2; i <= n; ++i) {
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs(1, -1);\/\/dfs
printf("%d\n", ans);
return 0;
}

鲁ICP备2025150228号