题目链接:

https://cn.vjudge.net/problem/1576783/origin

输入输出:

Examples
inputCopy
4
2 4
4 1
3 1
outputCopy
1
inputCopy
3
1 2
1 3
outputCopy
-1
inputCopy
10
7 1
8 4
8 10
4 7
6 5
9 3
3 5
2 10
2 5
outputCopy
4
inputCopy
2
1 2
outputCopy
0
Note
In the first example you can remove the edge between vertices 11 and 44. The graph after that will have two connected components with two vertices in each.

In the second example you can't remove edges in such a way that all components have even number of vertices, so the answer is −1

题目大意:

这道题其实题意很简单,给你一棵树,让你删边,然后得到的子树节点个数要是偶数。

而边的个数在离散数学里定义是 m = n-1, 这个在建树的时候需要注意!

DFS的作用是统计这个节点连接的节点的个数,具体实现在代码中有注释。

下面是AC代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #define pb push_back
  5. #include <string.h>
  6.  
  7. using namespace std;
  8. const int MX = 1e5+;
  9. int vis[MX], sum[MX];
  10. int n;
  11. vector<int> G[MX];
  12.  
  13. int dfs(int x)
  14. {
  15. for(int i = ; i < G[x].size(); ++i)
  16. {
  17. int u = G[x][i];
  18. if(!vis[u])
  19. {
  20. vis[u] = ; // 经过的点先标记一下
  21. sum[x] += dfs(u); //沿着点DFS
  22. vis[u] = ; // 回溯
  23. }
  24. }
  25. sum[x]++; // 经过一个点则需要加一
  26. return sum[x];
  27. }
  28.  
  29. int main()
  30. {
  31. int ans = ;
  32. memset(vis, , sizeof(vis));
  33. memset(sum, , sizeof(sum));
  34. scanf("%d", &n);
  35. for(int i = ; i <= n-; ++i) // 建树初始化m = n-1
  36. {
  37. int u, v;
  38. scanf("%d%d", &u, &v);
  39. G[u].pb(v);
  40. G[v].pb(u); // 无向图!
  41. }
  42. if(n%) //节点为奇数则不可能都分为偶数节点的连通图
  43. {
  44. printf("-1\n");
  45. return ;
  46. }
  47. vis[] = ; // 初始节点的vis先标记为一
  48. dfs();
  49. for(int i = ; i <= n; ++i)
  50. {
  51. //cout << sum[i] << ' ';
  52. if(sum[i]% == ) ans++; // 节点个数为偶数则减
  53. }
  54. //cout << endl;
  55. printf("%d\n", ans-); //减一的理由是根节点节点数一定为偶数,但是其不能减。。
  56. }

如有疑问,欢迎评论指出!

Codeforces --- 982C Cut 'em all! DFS加贪心的更多相关文章

  1. codeforces 982C Cut 'em all!

    题意: 给出一棵树,问最多去掉多少条边之后,剩下的连通分量的size都是偶数. 思路: 如果本来就是奇数个点,那么无论去掉多少条边都不可能成立的. 如果是偶数个点,就进行一次dfs,假设一个点的父亲是 ...

  2. CF982C Cut 'em all! DFS 树 * 二十一

     Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. Cut 'em all! CodeForces - 982C(贪心dfs)

    K - Cut 'em all! CodeForces - 982C 给一棵树 求最多能切几条边使剩下的子树都有偶数个节点 如果n是奇数 那么奇数=偶数+奇数 不管怎么切 都会有奇数 直接打印-1 贪 ...

  4. Codeforces 982C(dfs+思维)

    C. Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  5. CodeForces 982 C Cut 'em all!

    Cut 'em all! 题意:求删除了边之后,剩下的每一块联通块他的点数都为偶数,求删除的边最多能是多少. 题解:如果n为奇数,直接返回-1,因为不可能成立.如果n为偶数,随意找一个点DFS建树记录 ...

  6. codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)

    题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...

  7. hdu 4004 (二分加贪心) 青蛙过河

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4004 题目意思是青蛙要过河,现在给你河的宽度,河中石头的个数(青蛙要从石头上跳过河,这些石头都是在垂 ...

  8. Codeforces Round #613 (Div. 2)D(贪心,分治)

    构造两颗深度为30的字典树(根节点分别是0和1),结点只有0和1,从根节点向下DFS,贪心取答案. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc ...

  9. Codeforces 982 C. Cut 'em all!(dfs)

    解题思路: 代码中有详细注解,以任意一点为根,dfs遍历这棵树. 每一个节点可能有好几个子树,计算每棵子树含有的节点数,再+1即为这整棵树的节点. 判断子树是否能切断与根之间的联系,如果子树含有偶数个 ...

随机推荐

  1. 去掉 Chrome(V66) 新标签页的8个缩略图

    1.Chrome程序资源文件路径: C:\Program Files (x86)\Google\Chrome\Application\66.0.3359.181\resources.pak 2.下载C ...

  2. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

  3. 内网ntp时间同步配置

    选择局域网中的一台机器作为ntp服务器,在ntp server上安装并启动ntpd客户端上要关闭ntpd,安装ntpdateCentOS7上这两个软件都是自带的,只需根据需要打开或者关闭.注意客户端机 ...

  4. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  5. TensorFlow迁移学习的识别花试验

    最近学习了TensorFlow,发现一个模型叫vgg16,然后搭建环境跑了一下,觉得十分神奇,而且准确率十分的高.又上了一节选修课,关于人工智能,老师让做一个关于人工智能的试验,于是觉得vgg16很不 ...

  6. 解读Scrapy框架

    Scrapy框架基础:Twsited Scrapy内部基于事件循环的机制实现爬虫的并发.原来: url_list = ['http://www.baidu.com','http://www.baidu ...

  7. Vim使用技巧:常用光标跳转命令

    Vim中的命令多如牛毛,按需学习才是唯一出路.这里总结了几个常用的光标跳转命令. 基本移动: h(往左) j(往下) k(往上) l(小写字母l,往右) 行间移动: 快速跳至文件末行:G(大写字母G) ...

  8. WPF中的常用布局

    一 写在开头1.1 写在开头评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好. 1.2 本文内容本文主要内容为WPF中的常用布局,大部分内容转载至https://blog.csdn.net ...

  9. HTML(五)HTML表格

    标准表格 <table border="1"> <caption>Monthly savings</caption> <tr> &l ...

  10. 在 Visual Studio 中使用 IntelliTrace 快照功能

    今天发现vs2017 IntelliTrace有了一个快照功能,测试一下它的用法 1.选项->IntelliTrace->选择第三项 2.建一个控制台应用程序 3.在main中写一个简单的 ...