描述
如果一棵树节点数目是偶数,那么就称这棵树是偶树。给定一棵N个节点的偶树(编号1~N),小Hi想知道他最多可以同时切断多少条边,使得剩下的森林中每一个联通分量都是一棵偶树。
例如如下的偶树:
1 / | | \ 2 3 4 5 | 6
可以切断1-2之间边使得剩下的每个联通分量都是偶树。
输入
第一行包含一个偶数N。
以下N-1行每行包含两个整数a和b,表示a和b之间有一条边。
对于30%的数据,1 ≤ N ≤ 20
对于100%的数据, 1 ≤ N ≤ 100000
输出
输出最多可以切断的边数。
6 1 2 3 1 4 1 1 5 6 2样例输出
1
ans表示边数,分析可知,当该节点有奇数个儿子时ans++。最后减去根节点的1就是答案。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int ma=110000;
vector<int>G[ma];
int f[ma];
int ans=0;
int son[ma];
int dfs(int x,int fa)
{
int sum=0;
for(int i=0;i<G[x].size();i++)
{
int v=G[x][i];
if(v!=fa)
{
f[v]=x;
son[i]=dfs(v,x);
sum+=son[i];
}
}
if(sum%2==1)ans++;
return sum+1;
}
int main()
{
while(~scanf("%d",&n))
{
int u,v;
memset(son,0,sizeof(son));
for(int i=0;i<=n;i++)G[i].clear();
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
ans=0;
dfs(1,0);
printf("%d\n",ans-1);
}
return 0;
}