题目链接:http://codeforces.com/problemset/problem/337/D

题意:

  给你一棵树,n个节点。

  如果一个节点处放着“罪恶之书”,那么它会影响周围距离不超过d的所有节点。

  然后告诉你一部分被影响的节点aff[i],共m个。

  已知有且仅有一个节点放着“罪恶之书”。

  现在问你有多少个节点可能放着“罪恶之书”。

题解:

  如果一个节点放着“罪恶之书”,那么它到所有aff[i]的距离都不超过d。

  也就是:max(它到aff[i]的距离) <= d

  有一个关于树的直径的结论:

    从一个点出发,不重复经过节点,若要使走的路程最远,则最终到达的点一定是树的直径的某个端点。

  在这道题中就是:

    从一个点出发,若到达aff[i]的距离在所有受影响的节点中最大。

    则节点i一定是受影响的点中,两两距离最远的一对点(op,ed)中的一个。

  所以要找出在aff[i]中,两两距离最远的一对点(op,ed)。

  也就是求所有aff[i]构成的一棵树的直径:

    先随便找一个aff[i],从它开始dfs1一遍,找出最远的点即为op。

    再从op开始,dfs1一遍,找出ed。

  然后从op和ed分别做一次dfs2,给每个距离不超过d的点的cnt加1。

  最后统计一下cnt为2的点的个数,即为答案。

AC Code:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. #define MAX_N 100005
  6.  
  7. using namespace std;
  8.  
  9. int n,m,d;
  10. int maxd;
  11. int op,ed;
  12. int aff[MAX_N];
  13. int cnt[MAX_N];
  14. bool flag[MAX_N];
  15. vector<int> edge[MAX_N];
  16.  
  17. void read()
  18. {
  19. cin>>n>>m>>d;
  20. memset(flag,false,sizeof(flag));
  21. for(int i=;i<=m;i++)
  22. {
  23. cin>>aff[i];
  24. flag[aff[i]]=true;
  25. }
  26. int x,y;
  27. for(int i=;i<n;i++)
  28. {
  29. cin>>x>>y;
  30. edge[x].push_back(y);
  31. edge[y].push_back(x);
  32. }
  33. }
  34.  
  35. void dfs1(int now,int p,int nd,int &v)
  36. {
  37. if(nd>maxd && flag[now])
  38. {
  39. maxd=nd;
  40. v=now;
  41. }
  42. for(int i=;i<edge[now].size();i++)
  43. {
  44. int temp=edge[now][i];
  45. if(temp!=p)
  46. {
  47. dfs1(temp,now,nd+,v);
  48. }
  49. }
  50. }
  51.  
  52. void dfs2(int now,int p,int stp)
  53. {
  54. if(stp>d) return;
  55. cnt[now]++;
  56. for(int i=;i<edge[now].size();i++)
  57. {
  58. int temp=edge[now][i];
  59. if(temp!=p) dfs2(temp,now,stp+);
  60. }
  61. }
  62.  
  63. void work()
  64. {
  65. maxd=-;
  66. dfs1(aff[],-,,op);
  67. maxd=-;
  68. dfs1(op,-,,ed);
  69. memset(cnt,,sizeof(cnt));
  70. dfs2(op,-,);
  71. dfs2(ed,-,);
  72. int ans=;
  73. for(int i=;i<=n;i++)
  74. {
  75. if(cnt[i]==) ans++;
  76. }
  77. cout<<ans<<endl;
  78. }
  79.  
  80. int main()
  81. {
  82. read();
  83. work();
  84. }

Codeforces 337D Book of Evil:树的直径【结论】的更多相关文章

  1. codeforces 14D(搜索+求树的直径模板)

    D. Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input o ...

  2. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

  3. codeforces 337D Book of Evil(dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Book of Evil Paladin Manao caught the tra ...

  4. Codeforces 379F New Year Tree 树的直径的性质推理

    New Year Tree 我们假设当前的直径两端为A, B, 那么现在加入v的两个儿子x, y. 求直径的话我们可以第一次dfs找到最远点这个点必定为直径上的点, 然而用这个点第二次dfs找到最远点 ...

  5. Codeforces 337D Book of evil

    一道树形dp,写出来是因为最近也做了道类似的.这题是看了分析的思路才做出来的,但感觉很多这样的dp都是利用类似的性质.像这题的话distDown很好想,但distUp的时候就很难想了,其实只要抓住di ...

  6. codeforces 337D 树形DP Book of Evil

    原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知 ...

  7. codeforce 337D Book of Evil ----树形DP&bfs&树的直径

    比较经典的老题 题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d. 这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来 ...

  8. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  9. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

随机推荐

  1. sklearn函数白板

    #使用make_classification构造500个样本,每个样本有20个feature from sklearn.datasets import make_classification X, y ...

  2. Amzaon EC2虚拟化技术演进:从 Xen 到 Nitro

      今年2月,由光环新网运营的 AWS 中国(北京)区域和由西云数据运营的 AWS 中国 (宁夏)区域发布新的实例类型,新的实例类型包括 C5.C5d.R5.R5d.除了这四种之外,在AWS国外部分区 ...

  3. python 的三元表达式

    python中的三目运算符不像其他语言 其他的一般都是 判定条件?为真时的结果:为假时的结果 如 result=5>3?1:0 这个输出1,但没有什么意义,仅仅是一个例子. 而在python中的 ...

  4. json性能测试

    http://www.open-open.com/lib/view/open1434377191317.html

  5. EasyNVR结合阿里云/腾讯云CDN实现微信/小程序直播的方案

    背景需求: 许多客户有这样的需求:微信公众号做为平台来对摄像机进行直播:可以让用户随时随地打开公共号就可以观看:保证画面的流畅性:保证视频的并发访问量等. 问题分析: 虽然需求看似很简单,其实真正实现 ...

  6. ubuntu14.04 desktop 32-bit kvm装windows xp

    经过这几天来的折腾,总算是在ubuntu14.04用kvm装上了xp, 看不少的的贴,也绕了不少的圈,总的来说,非常感谢CSDN上的"上善若水75",看着他写的一个分类" ...

  7. 九度OJ 1255:骰子点数概率 (递归、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:316 解决:29 题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 输入: 输入包 ...

  8. rate limiter - system design

    1 问题 Whenever you expose a web service / api endpoint, you need to implement a rate limiter to preve ...

  9. 加密php源代码

    <?php function RandAbc($length = "") { //返回随机字符串 $str = "ABCDEFGHIJKLMNOPQRSTUVWXY ...

  10. HTML/CSS/JS初始化

    CSS <link type="text/css" href="http://www.mazey.cn/css/mazey-base.css" rel=& ...