解题思路:
1.当n为奇数时肯定有一棵树的顶点数为奇数,所以一定不行。
以任意一个顶点为根,求出所有点的根的树大小,用set维护以某点为根的树大小,从小到大枚举,当遇到树大小为偶数时就可以将其切下来。持续进行此操作即可。
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int mx = 1e5 + 10;
int n,siz[mx],fa[mx];
vector <int> vec[mx];
set <pair<int,int>> st;
void dfs(int x,int f)
{
fa[x] = f,siz[x] = 1;
for(int i=0;i<vec[x].size();i++)
{
int son = vec[x][i];
if(son==f) continue;
dfs(son,x);
siz[x] += siz[son];
}
st.insert(make_pair(siz[x],x));
}
int main()
{
int a,b,ans = 0;
scanf("%d",&n);
if(n&1) return 0*puts("-1");
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
vec[a].push_back(b);
vec[b].push_back(a);
}
dfs(1,0);
for(int i=1;i<n;i++){
auto it = st.begin();
if(it->fi%2==0){
ans++;
int tic = fa[it->se];
auto ip = st.find(make_pair(siz[tic],tic));
st.erase(ip);
siz[tic] -= siz[it->se];
st.insert(make_pair(siz[tic],tic));
}
st.erase(it);
}
printf("%d\n",ans);
return 0;
}