这道题比较坑的地方在于要仔细读题,发现输入的节点数都是偶数,所以这样就比较好想了,只要保证子节点的个数是奇数,利用dfs即可。但是注意最后减1。因为根节点上边的边是没有的。这道题我想了很久
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
描述
如果一棵树节点数目是偶数,那么就称这棵树是偶树。给定一棵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
代码:
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
vector<int>G[100100];
int lala;
int ans;
int dfs(int x,int fa)
{
int sum=0;
lala=0;
for(int i=0;i<G[x].size();i++)
{
int v=G[x][i];
if(v!=fa)
{
lala=dfs(v,x);
sum+=lala;
}
}
if(sum%2==1)
ans++;
return sum+1;
}
int main()
{
int u,v;
int n;
while(scanf("%d",&n)!=EOF)
{
//memset(lala,0,sizeof(lala));
for(int i=0;i<=n;i++)
G[i].clear();
ans=0;
for(int i=1;i<=n-1;i++)
{
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
cout<<ans-1<<endl;
}
return 0;
}