ABC333D 题解

题目传送门

思路

11 为根,将无根树变为有根树。

对于一个非 11 节点,首先我们要先消掉它的所有子节点。

但是如果要消除 11,我们可以剩下一个子节点(这样 11 也成了叶子节点)。

而剩下的子节点应该是子树大小最大的。

再来手搓一组样例:

我们看到,如果要删除 11,首先一定要删除 224477 之中的三个。

但是删除 22 只需要删除 33,删除 44 只需要删除 5566,而删除 77 需要删除 889910101111

很明显,删除 2233,留下 77 更合算。

所以这个样例答案是 66

#include<bits/stdc++.h>
using namespace std;
int head[600005],to[600005],from[600005],cnt,nxt[600005],son[600005];
void add(int u,int v){
	to[++cnt]=v;
	from[cnt]=u;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
int n,u,v;
int dfs(int now,int fa){
	int ans=0;
	for(int i=head[now];i;i=nxt[i]){
		if(to[i]!=fa)ans+=dfs(to[i],now); 
	} 
	son[now]=ans+1;
	return ans+1;
}
int du=0,kiss[300005],tot;
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		add(u,v);
		add(v,u);
		if(u==1||v==1)du++;
	}
	if(du==1||du==0){
		cout<<1<<endl;
		return 0;
	}
	dfs(1,0);
	int ans=0,maxx=0;
	for(int i=head[1];i;i=nxt[i]){
		ans+=son[to[i]];
		maxx=max(maxx,son[to[i]]);
	}
	cout<<ans-maxx+1;
	return 0;
}
posted @   Weslie_qwq  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示