CF982C

· · 题解

题解思路:

当节点数是奇数的时候,连通块内一定会有一个是奇数个点,所以一定无解。

那么节点数是偶数的时候,我们对于每条边来说,当他连着的部分有奇数个点,那么这条边一定不能删,若都是偶数个点,那么就要删掉。

那么我们就一遍 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;
}