题目大意:给你一个地图(树),共有1~n个驿站(点),编号分别为1~n,告诉你第ui个驿站与第vi个驿站有一条长度为1的路(边),每个小队(可以放在任意驿站上)最多有k的覆盖长度,问最多要放置多少个小队才能把整张图全部覆盖?

把一个驿站当作市中心(树根),显然离市中心越偏远(深度越深)的驿站就越难被控制,所以我们优先考虑深度最深的节点。用来控制深度最深的节点v的小队应当布置在能控制到v且离v最远的节点u上,这样顺带着控制到的节点是最多的。所以具体操作为:将节点按照深度从大到小排序,判断是否覆盖过,如果没覆盖过,找其k级父亲并覆盖其周围距离不超过k的所有节点。这种方法没有后效性,因为选了一个节点不会导致其它节点不能选。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cstdarg>
  6. using namespace std;
  7.  
  8. const int MAX_NODE = 100010;
  9. int K;
  10.  
  11. void _printf(const char *format, ...)
  12. {
  13. #ifdef _DEBUG
  14. //va_list(args);
  15. //va_start(args, format);
  16. //vprintf(format, args);
  17. //va_end(args);
  18. #endif
  19. }
  20.  
  21. struct Node
  22. {
  23. int Id;
  24. int Depth;
  25. Node *Fa;
  26. vector<Node*> Next;
  27. bool Ctrled;
  28. }_nodes[MAX_NODE], *Root, *Order[MAX_NODE];
  29. int TotNode;
  30.  
  31. void AddEdge(int uId, int vId)
  32. {
  33. Node *u = _nodes + uId, *v = _nodes + vId;
  34. u->Id = uId, v->Id = vId;
  35. u->Next.push_back(v);
  36. v->Next.push_back(u);
  37. }
  38.  
  39. void Read()
  40. {
  41. int t, u, v;
  42. scanf("%d%d%d", &TotNode, &K, &t);
  43. for (int i = 1; i <= TotNode - 1; i++)
  44. {
  45. scanf("%d%d", &u, &v);
  46. AddEdge(u, v);
  47. }
  48. }
  49.  
  50. void Init_Dfs(Node *cur, Node *fa, int depth)
  51. {
  52. cur->Depth = depth;
  53. cur->Fa = fa;
  54. _printf("%d->%d depth %d\n", fa?fa->Id:0, cur->Id, cur->Depth);
  55. int len = cur->Next.size();
  56. for (int i = 0; i < len; i++)
  57. if (cur->Next[i] != fa)
  58. Init_Dfs(cur->Next[i], cur, depth + 1);
  59. }
  60.  
  61. void SetDepth()
  62. {
  63. Root = _nodes + 1;
  64. Init_Dfs(Root, NULL, 1);
  65. }
  66.  
  67. bool Cmp_Depth(Node *a, Node *b)
  68. {
  69. return a->Depth > b->Depth;
  70. }
  71.  
  72. void SetOrder()
  73. {
  74. for (int i = 1; i <= TotNode; i++)
  75. Order[i] = _nodes + i;
  76. sort(Order + 1, Order + TotNode + 1, Cmp_Depth);
  77. }
  78.  
  79. void SetCtrl_Dfs(Node *fa, Node *cur, int k)
  80. {
  81. _printf("ctrled %d\n", cur->Id);
  82. cur->Ctrled = true;
  83. int len = cur->Next.size();
  84. if (k < K)
  85. for (int i = 0; i < len; i++)
  86. if (cur->Next[i] != fa)
  87. SetCtrl_Dfs(cur, cur->Next[i], k + 1);
  88. }
  89.  
  90. int SetCtrl()
  91. {
  92. int ans = 0;
  93. for (int i = 1; i <= TotNode; i++)
  94. {
  95. Node *cur = Order[i];
  96. if (!cur->Ctrled)
  97. {
  98. _printf("deepest %d ", cur->Id);
  99. ans++;
  100. for (int j = 1; j <= K && cur->Fa; j++)
  101. cur = cur->Fa;
  102. _printf("lighted %d\n", cur->Id);
  103. SetCtrl_Dfs(NULL, cur, 0);
  104. }
  105. }
  106. return ans;
  107. }
  108.  
  109. int main()
  110. {
  111. Read();
  112. SetDepth();
  113. SetOrder();
  114. printf("%d\n", SetCtrl());
  115. return 0;
  116. }

  

luogu3942 将军令 贪心的更多相关文章

  1. [luogu3942] 将军令

    题面 ​ 题目的意思大概是给你一棵n个点的树, 求最少需要多少个多少个点, 整棵树都被覆盖(覆盖的意思是所有离被选中的点距离不大于k的点都视作已覆盖). ​ 考虑贪心(其实我考试的时候以为是道树形dp ...

  2. luogu3942将军令

    https://www.zybuluo.com/ysner/note/1302132 题面 在大小为\(n\)的树上选择尽量少的点,使得所有未选择的点距离选择了的点小于等于\(k\). \(n\leq ...

  3. 8.11 NOIP模拟测试17 入阵曲+将军令+星空

    T1 入阵曲 前缀和维护可以得60分 f[x1][y1][x2][y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];  O(n4) ...

  4. [洛谷P3942]:将军令(贪心)

    题目传送门 题目背景 历史/落在/赢家/之手至少/我们/拥有/传说谁说/败者/无法/不朽拳头/只能/让人/低头念头/却能/让人/抬头抬头/去看/去爱/去追你心中的梦 题目描述 又想起了四月.如果不是省 ...

  5. 【模拟8.11】将军令(贪心&&树形DP)

    只看45分的话,是树形DP....(当然也有能拿到70分+的大佬) 40分: 只考虑k==1的情况,树形DP 所以每个节点可能被父亲,自己,儿子控制 设f[MAXN][3],0表示儿子,1表示自己,2 ...

  6. 洛谷P2279 消防局的设立 [HNOI2003] 贪心

    正解:贪心 解题报告: 传送门! 这题贪心得挺显然的,,,?居然能有蓝,,,是蓝题太水了嘛,,,? 简单说下,这题一看到就能想到,对最低的没被覆盖到的点给它的祖父建一个消防局 没了? 哦这题实现还挺有 ...

  7. 洛谷 P3942 将军令 解题报告

    P3942 将军令 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小\(F\)成了一个给将军 ...

  8. P3942 将军令

    P3942 将军令 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫.小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务. 不过 ...

  9. [洛谷P3942] 将军令

    洛谷题目链接:将军令 题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又 ...

随机推荐

  1. 【SQL】字符型函数

    1. ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统. 1) 返回 ...

  2. C# 彻底关闭程序,包括循环

    System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close();

  3. Embedded之Stack之一

    1 Intro When a program starts executing, a certain contiguous section of memory is set aside for the ...

  4. OpenCV: kalman滤波的代码段

    序言:在我的疲劳检测工程 AviTest中!显示框为320*240,使用OpenCV的kalman滤波算法,可以实现简单的锁相追踪-实现对眼球的位置锁定. 代码如下: CvPoint Wishchin ...

  5. 通用功能类:改变WinForm窗体显示颜色

    一.显示窗体调用方法 protected override void OnLoad(EventArgs e)        {            MDIClientSupport.SetBevel ...

  6. java HttpURLConnection 登录网站 完整代码

    import java.io.*; import java.util.*; import java.net.*; public class WebTest { public static void m ...

  7. 07.网络编程-3.TCP

    1.tcp相关介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC ...

  8. PHP AES cbc模式 pkcs7 128加密解密

    今天在对接一个第三方接口的时候,对方需要AES CBC模式下的加密.这里简单写一个demo class Model_Junjingbao extends Model { private static ...

  9. 【ABCD组】Scrum meeting 5

    前言 第5次会议在6月17日由组长在教9 405召开. 主要对下一步的工作进行说明安排,时长90min. 主要内容 分配下阶段任务,争取在这阶段完成软件的设计阶段 任务分配 姓名 当前阶段任务 贡献时 ...

  10. FusionCharts,双折线图和双柱状图

    一个电商项目中,用到了"双柱状图",对比 当前库存和累计库存. 网上找了好几个贴子,才找到具体用法. 代码整理下,以备不时之需. 效果图-双折线图 效果图-双柱状图 <%@ ...