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 @ 2023-12-17 13:50  Weslie_qwq  阅读(22)  评论(0)    收藏  举报  来源