题目大意:给你一个地图(树),共有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. python 进程理论基础

    背景知识 顾名思义,进程即一个软件正在进行的过程.进程是对正在运行的程序的一个抽象 进程的概念起源于操作系统,是操作系统的最核心的概念,也是操作系统提供的最古老的也是最重要的抽象概念之一.操作系统的其 ...

  2. c# 官方文档必看

    https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history

  3. 关于Core里的 StartUp里的方法的理解。

    public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; ...

  4. DataTable如何去除重复的行

    两种方法1 数据库直接去除重复select distinct * from 表名去除了重复行distinct 2 对 DataTable直接进行操作DataTable dt=db.GetDt(&quo ...

  5. SQL Server存储过程作业(一)

    创建客房类型表RoomType 创建客房状态表RoomState 创建客房信息表Room 创建结账状态表ResideState 创建客人信息表GuestRecord 编写sql语句 USE maste ...

  6. iproute2和tc的高级路由用法

    #Linux advanced router ip link show #显示链路 ip addr show #显示地址(或ifconfig) ip route show #显示路由(route -n ...

  7. react工具库

    采用了react框架后,需要找到一些常用的库,常见的需求比如: 1)react生成二维码 2)react的轮播banner图 随着react的社区的壮大,以上的需求都有专门的库帮我们做这个: 1)re ...

  8. Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)

    QuartzHostedService  是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...

  9. 5G vs AI谁更有前途?

    5G vs AI谁更有前途? 5G通信技术和AI人工智能技术是两个不同层面的技术领域,而它们两者都将在未来20年内对世界的发展有着革命性和里程碑式的影响.未来5G和AI谁更有前途呢? 5G技术的发展和 ...

  10. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...