codeforces 982C Cut 'em all!

题意:

给出一棵树,问最多去掉多少条边之后,剩下的连通分量的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\n");
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\n",ans);
44     return 0;
45 }

 

posted @ 2018-05-18 03:27  qrfkickit  阅读(437)  评论(0编辑  收藏  举报