codeforces 982C Cut 'em all!

本文介绍了一种基于深度优先搜索(DFS)的算法,用于解决特定树形结构问题:即如何通过移除最少数量的边使得每个连通分量的节点数为偶数。文章详细解释了算法的基本思想,并提供了完整的C++实现代码。

题意:

给出一棵树,问最多去掉多少条边之后,剩下的连通分量的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 }

 

转载于:https://www.cnblogs.com/kickit/p/9054233.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值