题解

首先看到这题 \(k=1\) 时,就是一道 小胖守皇宫,那么由 \(k=1\) 联想到 \(k=2...20\) 发现可以树形 \(DP\)

但转移方程太难想,不太适合考场做。

考虑贪心:

对所有节点先按深度由大到小排序,对于每一个未覆盖的节点,我们选择他的第 \(k\) 级祖先。

证明:

对于一个节点,我们选他的第 \(k\) 级祖先,这样布置可以覆盖最大的范围,同时因为我们是按深度在搜,所以这样决策无后效性。

对于按深度排序,可以先 \(dfs\) 再排,后直接一个 \(bfs\)

Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=1e5+7;
int que[N],first[N],vis[N],fa[N],dep[N],t=1,n,k,tt,ans;
struct edge{int v,nxt;}e[N<<1];
inline void add(int u,int v) {
e[t].v=v;
e[t].nxt=first[u];
first[u]=t++;
}
inline void bfs() {
int hd=1,tl=0,tot=0;
que[p(tl)]=1;
while(hd<=tl) {
int x=que[hd++];
dep[p(tot)]=x;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if (fa[v=e[i].v]||v==1) continue;
fa[que[p(tl)]=e[i].v]=x;
}
}
}
void dfs(int x,int fa,int dis){
vis[x]=1;
if (dis==k) return;
for (ri i(first[x]),v;i;i=e[i].nxt) if ((v=e[i].v)!=fa) dfs(v,x,dis+1);
}
inline int find(int x) {
for (ri i(1);i<=k;p(i)) {
x=fa[x];
if (!x) return 1;
}
return x;
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n),read(k),read(tt);
for (ri i(1);i<n;p(i)) {
int u,v;read(u),read(v);
add(u,v);add(v,u);
}
bfs();
for (ri i(n);i;--i) {
if (vis[dep[i]]) continue;
p(ans);
int f=find(dep[i]);
dfs(f,0,0);
}
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

最新文章

  1. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能
  2. LeetCode Find All Duplicates in an Array
  3. GridView控件显示图片
  4. linux trap
  5. 基于vue2.0的一个分页组件
  6. 在Eclipse中使用Maven构建SpringMVC项目
  7. 腾讯云数据库团队:PostgreSQL TOAST技术理解
  8. JVM菜鸟进阶高手之路五
  9. 浅析is和as两个关键词在类型转换时的使用
  10. centos 7安装pycharm
  11. redis 中如何切换db
  12. Windows上安装配置SSH教程(4)——WinSCP+OpenSSH 使用公钥自动登陆
  13. java安装和配置(3.18)
  14. gp工具的许可
  15. JVM系列2:垃圾收集器与内存分配策略
  16. Mysql的变量一览
  17. 实例化Flask的参数 及 对app的配置
  18. java的finally用法
  19. Mac下安装pcl-1.8.0
  20. js异步获取数据的问题

热门文章

  1. Oracle如何以逗号分隔的字符串拆分为多行数据
  2. WPF教程十:如何使用Style和Behavior在WPF中规范视觉样式
  3. C语言:统计字符个数及种类
  4. 得力e+考勤机更新网络连接
  5. Oracle执行计划总结
  6. vulnhub-XXE靶机渗透记录
  7. java学习笔记之OOP(二)
  8. C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍
  9. 15Java进阶 进程
  10. FreeRTOS-03-其它任务相关函数