CF963B Destruction of a Tree

CF963B Destruction of a Tree

题目大意:有一个 nn 个节点的树,如果一个点有偶数条边和他相连,那么这个点就可以删去。如果这棵树可以被完全删除的话,输出每个节点依次删除的顺序。

首先,如果 nn 个点,由于是树,就有 n1n-1 条边。如果 nn 为偶数的话,n1n-1为奇数。删边的时候会有剩余,无法满足题意,输出 NO 即可。

对于 nn 为奇数时,我们先用一遍深搜,从叶子节点开始,在回溯的时候处理出每个节点子树大小。

在第二个深搜时,我们开始检查当前节点是否可以被删去,即当前节点的子树数量为偶数的时候,直接输出当前节点即可。否则的话继续往下搜索。

code:

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
int siz[N];
vector<int> g[N];
void dfs1(int node,int fath)
{
	siz[node]=1;
	for(int i=0;i<g[node].size();i++)
	{
		int pre=g[node][i];
		if(pre==fath)
			continue;
		dfs1(pre,node);
		siz[node]+=siz[pre];
	}
}
void dfs2(int node,int fath)
{
	for(int i=0;i<g[node].size();i++)
	{
		int pre=g[node][i];
		if(pre==fath)
			continue;
		if(siz[pre]%2==0)
			dfs2(pre,node);
	}
	cout<<node<<endl;
	for(int i=0;i<g[node].size();i++)
	{
		int pre=g[node][i];
		if(pre==fath)
			continue;
		if(siz[pre]%2!=0)
			dfs2(pre,node);
	}
}
int main()
{
	int n;
	cin>>n;
	if(n%2==0)
	{
		cout<<"NO"<<endl;
		exit(0);
	}
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		if(x==0)
			continue;
		g[i].push_back(x);
		g[x].push_back(i);
	}
	dfs1(1,1);
	cout<<"YES"<<endl;
	dfs2(1,1);
}
posted @   June_Failure  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示