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

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

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cstdarg>
using namespace std; const int MAX_NODE = 100010;
int K; void _printf(const char *format, ...)
{
#ifdef _DEBUG
//va_list(args);
//va_start(args, format);
//vprintf(format, args);
//va_end(args);
#endif
} struct Node
{
int Id;
int Depth;
Node *Fa;
vector<Node*> Next;
bool Ctrled;
}_nodes[MAX_NODE], *Root, *Order[MAX_NODE];
int TotNode; void AddEdge(int uId, int vId)
{
Node *u = _nodes + uId, *v = _nodes + vId;
u->Id = uId, v->Id = vId;
u->Next.push_back(v);
v->Next.push_back(u);
} void Read()
{
int t, u, v;
scanf("%d%d%d", &TotNode, &K, &t);
for (int i = 1; i <= TotNode - 1; i++)
{
scanf("%d%d", &u, &v);
AddEdge(u, v);
}
} void Init_Dfs(Node *cur, Node *fa, int depth)
{
cur->Depth = depth;
cur->Fa = fa;
_printf("%d->%d depth %d\n", fa?fa->Id:0, cur->Id, cur->Depth);
int len = cur->Next.size();
for (int i = 0; i < len; i++)
if (cur->Next[i] != fa)
Init_Dfs(cur->Next[i], cur, depth + 1);
} void SetDepth()
{
Root = _nodes + 1;
Init_Dfs(Root, NULL, 1);
} bool Cmp_Depth(Node *a, Node *b)
{
return a->Depth > b->Depth;
} void SetOrder()
{
for (int i = 1; i <= TotNode; i++)
Order[i] = _nodes + i;
sort(Order + 1, Order + TotNode + 1, Cmp_Depth);
} void SetCtrl_Dfs(Node *fa, Node *cur, int k)
{
_printf("ctrled %d\n", cur->Id);
cur->Ctrled = true;
int len = cur->Next.size();
if (k < K)
for (int i = 0; i < len; i++)
if (cur->Next[i] != fa)
SetCtrl_Dfs(cur, cur->Next[i], k + 1);
} int SetCtrl()
{
int ans = 0;
for (int i = 1; i <= TotNode; i++)
{
Node *cur = Order[i];
if (!cur->Ctrled)
{
_printf("deepest %d ", cur->Id);
ans++;
for (int j = 1; j <= K && cur->Fa; j++)
cur = cur->Fa;
_printf("lighted %d\n", cur->Id);
SetCtrl_Dfs(NULL, cur, 0);
}
}
return ans;
} int main()
{
Read();
SetDepth();
SetOrder();
printf("%d\n", SetCtrl());
return 0;
}

  

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. Redis学习笔记(二)-key相关命令

    Redis支持的各种数据类型包括string,list ,set ,sorted set 和hash . Redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符 ...

  2. Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)

    Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...

  3. GitHub上fork别人打代码后如何保持和原作者同步的更新

    1.进入你的GitHub发起Pull  request 2.选择compare across  forks 3.反向操作.base fork改为自己的,head fork改为原作者的 4.点击 cre ...

  4. 【Linux】创建逻辑卷管理(LVM)

    LVM是对磁盘进行分区管理的机制.LVM有很多优点:在线扩容,跨磁盘分区......,缺点:管理相对麻烦.创建LVM的过程如下: LVM是基于普通分区或者整块硬盘来进行的.我们首先把这些存储转换为PV ...

  5. REST ful

    前后端分离.面向资源.无状态: 请求包含全部信息. 什么是 REST? 下面六条准则定义了一个 REST 系统的特征: 客户-服务器(Client-Server),提供服务的服务器和使用服务的客户需要 ...

  6. brew 安装的.net 运行时提示"Did you mean to run dotnet SDK commands?"

    原因未知,但有解决方案 使用 brew cask 安装的.NET Core brew cask install dotnet 结果运行时出现: 解决方案: 下载官方 .pkg 文件安装,顺便卸载掉 b ...

  7. Javascript语法,变量类型,条件,循环语句,函数,面向对象

    1.JavaScript代码革两种存在形式: <!-- 方式一 --> <script type='txt/javascript' src='/js/comment.js'>& ...

  8. day34-3 类和对象小知识

    目录 属性查找顺序 类与对象的绑定方法 类与数据类型 对象的高度整合 属性查找顺序 属性查找顺序:先从对象自身查找,对象没有就去类中查找,类中没有则报错 class Student: name = ' ...

  9. Java中类似单元格之间的计算公式解析,如A1+B3-B4

    package net.riking.util; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; ...

  10. Django 模型层(标签、过滤器、模板的继承与导入)

    过滤器/自定义过滤器 模板语法中的过滤器类似于python中的内置方法,在我们把数据从后端通过rander传入到前端html文件中之后,在前端我们可以通过模板语法,对传入的数据再进行以通骚操作. 首先 ...