ABC333D 题解
题目传送门。
思路
以 为根,将无根树变为有根树。
对于一个非 节点,首先我们要先消掉它的所有子节点。
但是如果要消除 ,我们可以剩下一个子节点(这样 也成了叶子节点)。
而剩下的子节点应该是子树大小最大的。
再来手搓一组样例:

我们看到,如果要删除 ,首先一定要删除 、、 之中的三个。
但是删除 只需要删除 ,删除 只需要删除 、,而删除 需要删除 、、、。
很明显,删除 、,留下 更合算。
所以这个样例答案是 。
#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;
}

浙公网安备 33010602011771号