Logo FiraCode 的博客

博客

CF982C

...
FiraCode
2025-12-01 12:55:20
什么意思呢

本文章由 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;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。