题目链接:点击打开链接
如果节点数是奇数,那么直接输出-1
以任意一点为根节点,进行dfs,如果第i个节点的子树节点(包括本身)数为偶数,ans++;
最后答案为ans-1;
#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<map>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define sqr(a) (a)*(a)
#define For(i,m,n) for(int i=m;i<=n;i++)
#define Dor(i,n,m) for(int i=n;i>=m;i--)
#define lan(a,b) memset(a,b,sizeof(a))
#define maxn 100010
using namespace std;
vector<int> edge[maxn];
int vis[maxn];
int n;
int ans;
int dfs(int s)
{
//cout << s << endl;
vis[s]=1;
int sum=1;
For(i,0,edge[s].size()-1)
{
int to=edge[s][i];
//printf("to=%d\n",to);
if(vis[to])
continue;
sum+=dfs(to);
}
if(!(sum&1))
ans++;
return sum;
}
int main()
{
while(~scanf("%d",&n))
{
ans=0;
For(i,1,n)
edge[i].clear();
lan(vis,0);
For(i,1,n-1)
{
int q,p;
scanf("%d%d",&p,&q);
edge[p].push_back(q);
edge[q].push_back(p);
}
if(n&1)
{
printf("-1\n");
continue;
}
dfs(1);
printf("%d\n",ans-1);
}
return 0;
}