Codeforces Global Round 16 E

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;
}
posted @ 2023-01-18 14:53  ycllz  阅读(18)  评论(0)    收藏  举报