题解 | 小红的树上删边 | 又双叒叕是贪心

小红的树上删边

https://www.nowcoder.com/practice/675ca4c5402945148f99c46418c1b82a

注意到随便选定一个点为根,对于非根节点 u 来说,它的连向父亲的边能够删,当且仅当该点为根的子树大小为偶数。

因为子树中不管已经删除多少次边了,删除连向父亲的后该点所在的连通块的大小(每次减偶数)的奇偶性始终不变(与原来子树大小相同)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin>>n;
    vector<vector<int>> e(n+1); 
    vector<int> sz(n+1);
    for(int i=2;i<=n;i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    int ans=0;
    auto dfs = [&](auto&& self,int u,int f)->void{
        sz[u]=1;
        for(auto v:e[u]){
            if(v==f)continue;
            self(self,v,u);
            sz[u]+=sz[v];
        }
        ans+=f&&sz[u]%2==0;
    };
    dfs(dfs,1,0);
    cout<<(n&1?-1:ans)<<"\n";
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
12-11 14:24
门头沟学院 Java
牛客35720396...:不要用boss,全是骗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务