注意到随便选定一个点为根,对于非根节点 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")