题解 | 小红的树上删边 | 又双叒叕是贪心
小红的树上删边
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")
