You're given a tree with n
vertices.
Your task is to determine the maximum possible number of edges that can be removed in such a way that all the remaining connected components will have even size.
The first line contains an integer n
) denoting the size of the tree.
The next n−1
lines contain two integers u, v ( 1≤u,v≤n) each, describing the vertices connected by the i-th edge.
It's guaranteed that the given edges form a tree.
Output a single integer k
if it is impossible to remove edges in order to satisfy this property.
4 2 4 4 1 3 1
1
3 1 2 1 3
-1
10 7 1 8 4 8 10 4 7 6 5 9 3 3 5 2 10 2 5
4
2 1 2
0
In the first example you can remove the edge between vertices 1
. The graph after that will have two connected components with two vertices in each.
In the second example you can't remove edges in such a way that all components have even number of vertices, so the answer is −1
#define happy
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define all(a) (a).begin(),(a).end()
#define pll pair<ll,ll>
#define vi vector<int>
#define pb push_back
const int inf=0x3f3f3f3f;
ll rd(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int N=1e5+10;
vi mp[N];
int sz[N];
void dfs(int p,int u){
sz[u]=1;
for(int v:mp[u]){
if(v==p)continue;
dfs(u,v);
sz[u]+=sz[v];
}
}
int main(){
#ifdef happy
freopen("in.txt","r",stdin);
#endif
int n=rd();
if(n%2)return puts("-1"),0;
rep(i,1,n-1){
int x=rd(),y=rd();
mp[x].pb(y);
mp[y].pb(x);
}
dfs(-1,1);
int ans=-1;
rep(i,1,n)if(sz[i]%2==0)ans++;
printf("%d\n",ans);
}