题意:
给出一棵树,问最多去掉多少条边之后,剩下的连通分量的size都是偶数。
思路:
如果本来就是奇数个点,那么无论去掉多少条边都不可能成立的。
如果是偶数个点,就进行一次dfs,假设一个点的父亲是u,儿子是v,那么可以去掉(u,v)的条件就是v及其子树有偶数个点,任何一条这样的边都是可以去掉的。
所以一边dfs,一边统计答案就可以了。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <set> 5 #include <map> 6 #include <vector> 7 using namespace std; 8 const int N = 1e5 + 10; 9 vector<int> g[N]; 10 int ans = 0; 11 int cnt[N]; 12 int dfs(int u,int fa) 13 { 14 int ret = 0; 15 for (int v:g[u]) 16 { 17 if (v != fa) 18 { 19 int tmp = dfs(v,u); 20 if (tmp % 2 == 0) ans++; 21 ret += tmp; 22 } 23 } 24 return ret + 1; 25 } 26 int main() 27 { 28 int n; 29 scanf("%d",&n); 30 if (n & 1) 31 { 32 printf("-1 "); 33 return 0; 34 } 35 for (int i = 1;i < n;i++) 36 { 37 int x,y; 38 scanf("%d%d",&x,&y); 39 g[x].push_back(y); 40 g[y].push_back(x); 41 } 42 dfs(1,-1); 43 printf("%d ",ans); 44 return 0; 45 }