E. Buds Re-hanging
题链
观察样例我们发现我们要尽可能的分解出来bud
然后再来组合拼在一起是最优的
当然我们可以从深度最深的开始判断是不是bud
但是我们再观察 发现只要该结点有一个儿子不是bud 那么他一定就是bud
这样就少了一个log
我们考虑拆开了所有bud之后正确计算
我们发现每一个bud拼上去 都会减少一个叶子
假设我们现在有cnt个bud 那么就有n-cnt-1个叶子
ans就是n-cnt*2-1
但是我们发现过不了第二个样例
是因为 我们所有都分解成bud了 第一个bud就没法减少叶子数了
其实这样还有另一种理解方式:
就是这棵树的拆分都只有一种方式 我们这样拼凑 肯定是最优的
vector<int>g[N];
int n,cnt;
bool dfs(int u,int fa){
bool res=false;
for(auto v:g[u]){
if(v==fa)continue;
res|=!dfs(v,u);
}
if(res&&fa!=0)cnt++;
return res;
}
void solve(){
cin>>n;
cnt=0;
for(int i=1;i<=n;i++)g[i].clear();
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
if(dfs(1,0))cout<<n-2*cnt-1<<endl;
else cout<<n-2*cnt<<endl;
}
标签:cnt,16,int,res,Global,Codeforces,dfs,fa,bud
From: https://www.cnblogs.com/ycllz/p/17059819.html