Loading

CF982C Cut 'em all! 题解

Problem

Solution

容易想到如果 \(n\) 为奇数,一定不可以(因为奇数不管怎么拆分成偶数总会剩下一个奇数),所以输出直接判定无解。

接下来只用考虑 \(n\) 为偶数的情况。

题目要求要使每一颗森林中的树的大小要为偶数,即儿子数(自己也要算上)为偶数的节点均可删除其与父亲节点的连边使得构造出的树的大小为偶数。

所以只需要 DFS 预处理儿子数,然后统计有多少个偶数即可。

注意根节点不能算,因为它没有父亲节点。

Code

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)

const int N=1e5+4;
int n,sontot[N],ans;
bool vis[N];
vector<int> E[N];
void dfs(int x)
{
	sontot[x]=1;
	for(auto i:E[x])
		if(vis[i]==0)
		{
			vis[i]=1;
			dfs(i);
			sontot[x]+=sontot[i];
		}
}
int main()
{
	IOS;
	cin>>n;
	if(n%2==1)return cout<<"-1",0;
	For(i,1,n-1)
	{
		int u,v;cin>>u>>v;
		E[u].push_back(v);
		E[v].push_back(u);
	}
	vis[1]=1;
	dfs(1);
	For(i,2,n)if(sontot[i]%2==0)ans++;
	cout<<ans;

	return 0;
}
posted @ 2024-08-13 21:52  ๑҉v  阅读(13)  评论(0)    收藏  举报