题目大意:给你一个地图(树),共有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. 通过委托事件实现winform窗体之间的互相刷新

    新建winform窗体Form1和Form2; 接下来要通过点击Form2的按钮,实现Form1界面的同步刷新. 先展示一下最终效果: 1.Form1界面如下: 2.点击按钮弹出Form2,界面如下: ...

  2. 【原创】.Net 微信 JS-SDK图片、语音上传接口的实现(MVC)-(一 、上传图片)

    前段时间在做一个微信的项目,遇到了一个上传图片的问题,花了一下午,解决了这个问题,然后把总结出来的代码,分享了出来. 最近又有一个图片+语音的功能, 更是蛋疼, 本次采用的不是File文件上传,然后转 ...

  3. My97DatePicker 动态设置有效/无效日期

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  4. CSS多列布局(实例)

    前言 一列布局 二列布局 三列布局 1 一列布局 一列布局: HTML部分 <!DOCTYPE html> <html> <head> <meta chars ...

  5. spring3+quartz2

    听说来自这里www.ydyrx.com 转载的: 最近公司要用定时任务,自己想着学习并完成任务,百度,google,360,必应,能用的搜索都用了,参差不齐,搞了一整天,也没找到一个好的例子.没办法, ...

  6. mysql安装包下载地址

    1.打开mysql官网 :https://dev.mysql.com/ 2.选择 downlad-->windows-->MySQL Installer -->滑动至页面底部,选择第 ...

  7. Nginx服务的地址重写

    调整Nginx服务器配置,实现: 1.所有访问a.html的请求,重定向到b.html; 2.所有访问Nginx服务器(192.168.4.1)的请求重定向至www.baidu.com: 3.所有访问 ...

  8. SSM项目中表单分页操作(PageHepler使用)

    Maven pom.xml添加依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifa ...

  9. 原生js通过最外层id获取下面指定的子元素

    需求:在vue中使用v-for循环出来的元素,设置动态id,之后获取下面的所有textarea标签 template: <table cellpadding = 2 v-for="(i ...

  10. eas之kdtable分组

    如何指定是否要进行数据分组以及对哪些列进行分组 // 指定KDTable要进行数据分组 table.getGroupManager().setGroup(true); // 指明要对0.1.2三列进行 ...