题意:

给定一棵无根树,要求给树上 \(k\) 个点标记,使得所有点都至少与一个被标记的点相邻。(注意自己被标记不代表与标记相邻)

思路

考虑树形DP。

套路地设 \(f_{u,i,0/1,0/1}\) 表示树上的点 \(u\) 及其子树内已经被标记了 \(i\) 个点,自己有没有被标记、自己有没有与标记相邻。

然后考虑转移。发现对于一棵子树的根 \(u\) 和 其某个儿子 \(v\),如果要转移那 \(u\) 本身就已经与标记或者 \(v\) 被标记或者二者兼而有之。

然后就对应转移即可。

复杂度的证明有些神秘,事实上这个东西与分块是类似的。我们将子树大小小于 \(k\) 的树叫做小块,大于等于 \(k\) 的叫做大块。

  1. 如果是一些大块合并(当然也可以间杂一些小块)成为一个更大的块,由于我么枚举的上限是 \(k\) ,因此大块间的合并一次是 \(k^2\) 的,但是大块间的合并是不超过 \(\frac{n}{k}\) 次的,因此大块间合并的总复杂度为 \(O(nk)\)。
  2. 如果是一些小块(其中没有大块)合并成为了大块,那么与1类似的分析,这种小块合成大块的出现次数也小于等于 \(\frac{n}{k}\)。
  3. 如果是小块与小块合并后还是小块,那这种情况的总时间复杂度就是 \(O(nk)\)。

然后就可以了。

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll p=1e9+7;
const int N=1e5+7,M=105;
int n,k,tot[N],f[N][M][2][2],siz[N];
vector <int> q[N];
void dfs(int u,int fa){
ll tmp[M][2][2];memset(tmp,0,sizeof(tmp));siz[u]=1;
f[u][0][0][0]=f[u][1][1][0]=1;
for(int i=0;i<tot[u];i++){
int v=q[u][i];if(v==fa) continue;
dfs(v,u);
for(int a=0;a<=min(k,siz[u]);a++)
for(int b=0;b<=min(k,siz[v])&&a+b<=k;b++){
for(int p1=0;p1<2;p1++)for(int q1=0;q1<2;q1++)
for(int p2=0;p2<2;p2++)for(int q2=0;q2<2;q2++)
if(q2|p1)
tmp[a+b][p1][q1|p2]=(tmp[a+b][p1][q1|p2]+1ll*f[u][a][p1][q1]*f[v][b][p2][q2]%p)%p;
} siz[u]+=siz[v];
for(int j=0;j<=k;j++) for(int p1=0;p1<2;p1++) for(int q1=0;q1<2;q1++) f[u][j][p1][q1]=tmp[j][p1][q1],tmp[j][p1][q1]=0;
}
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=1,u,v;i<=n-1;i++){cin>>u>>v;q[u].push_back(v),tot[u]++;q[v].push_back(u),tot[v]++;}
dfs(1,0);
cout<<(f[1][k][1][1]+f[1][k][0][1])%p;
return 0;
}

P4516 [JSOI2018] 潜入行动 题解的更多相关文章

  1. BZOJ5314:[JSOI2018]潜入行动——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5314 https://www.luogu.org/problemnew/show/P4516 ht ...

  2. luogu P4516 [JSOI2018]潜入行动

    LINK:潜入行动 初看题感觉很不可做 但是树形dp的状态过于明显. 容易设\(f_{x,j,l,r}\)表示x为根子树内放了j个设备且子树内都被覆盖l表示x是否被覆盖r表示x是否放设备的方案数. 初 ...

  3. 洛谷 P4516 [JSOI2018]潜入行动

    题面传送门 一眼树形 \(dp\) 本题有 \(2\) 大难点. 难点之一是状态的设计,这里需要四维状态,\(dp[i][j][0/1][0/1]\) 表示在以 \(i\) 为根的子树内放了 \(j\ ...

  4. 【BZOJ5314】[JSOI2018]潜入行动(动态规划)

    [BZOJ5314][JSOI2018]潜入行动(动态规划) 题面 BZOJ 洛谷 题解 不难想到一个沙雕\(dp\),设\(f[i][j][0/1][0/1]\)表示当前点\(i\),子树中一共放了 ...

  5. BZOJ5314: [Jsoi2018]潜入行动

    BZOJ5314: [Jsoi2018]潜入行动 https://lydsy.com/JudgeOnline/problem.php?id=5314 分析: 裸树形背包,设\(f[x][i][0/1] ...

  6. [bzoj5314][Jsoi2018]潜入行动_树形背包dp

    潜入行动 bzoj-5314 Jsoi-2018 题目大意:题目链接. 注释:略. 想法: 学长给我们除了一套考试题,三个学长一人一道这是T1. 好吧好吧,傻逼背包...... 复杂度$O(nk)$. ...

  7. BZOJ5314 [Jsoi2018]潜入行动 【背包类树形dp】

    题目链接 BZOJ5314 题解 设\(f[i][j][0|1][0|1]\)表示\(i\)为根的子树,用了\(j\)个监测器,\(i\)节点是否被控制,\(i\)节点是否放置的方案数 然后转移即可 ...

  8. bzoj 5314: [Jsoi2018]潜入行动

    Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...

  9. BZOJ5314: [Jsoi2018]潜入行动 (树形DP)

    题意:一棵树选择恰好k个结点放置监听器 每个监听器只能监听相邻的节点 问能使得所有节点被监听的种类数 题解:反正就是很well-known的树形DP了 至于时间复杂度为什么是nk 不会不学 很好想到四 ...

  10. [loj2546][JSOI2018]潜入行动(树形DP)

    题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JYY 打算事先了解外星人的进攻 ...

随机推荐

  1. 科研界DeepSeek+AI应用协作攻略来了!

    自从DeepSeek爆火 AI应用届开启"精英集结" 与DeepSeek携手撑起国产AI一片天 比如,DeepSeek+Midjourney 成为设计师的好帮手 DeepSeek+ ...

  2. QT5笔记: 29. 文本文件读写

    例子:主要讲了 QFile .QTextStream 进行文本文件读写 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include ...

  3. Winform ShowDialog如何让先前Show的窗体可以交互

    背景描述 最近项目中有一个需求,全局有一个共用的窗体,能够打开不同模块的报告,由于需要兼容不同模块,代码复杂,启动速度慢.优化方案为将窗体启动时就创建好,需要查看报告时,使用此单例弹窗加载不同模块下的 ...

  4. PIP 换源:提升 Python 包安装速度的秘诀

    一.引言 在使用 Python 进行开发时,我们经常需要通过 pip 命令安装各种库和依赖.然而,默认的源可能会因为网络原因导致下载速度缓慢,影响开发效率.这时候,换源就成为了一个非常实用的技巧. 二 ...

  5. Azkaban - [01] 概述

    简单的任务调度使用crontab.复杂的任务调度使用oozie.azkaban等开发调度系统. 一.为什么学习Azkaban   一个完整的数据分析系统通常都是由大量任务单元(shell脚本.java ...

  6. thinkphp6实现仿微信朋友圈,用户可发布图片和文字内容,用户可评论,其他用户可评论文章,也可回复用户评论,多层级评论,无限级评论

    功能:仿微信朋友圈,用户可发布图片和文字内容,用户可评论,其他用户可评论文章,也可回复用户评论,多层级评论,无限级评论数据库示例:朋友圈内容表 article表:id content image li ...

  7. redmine 127访问成功,其他机器不能访问

    添加防火墙 入站规则

  8. ActiViz 在 .NET 环境下的 CT 图像渲染

    1. 什么是 ActiViz? ActiViz 是 VTK(Visualization Toolkit) 的 .NET 封装,提供了强大的 3D 计算机图形渲染功能,广泛应用于 医学影像(CT.MRI ...

  9. selenium爬虫2

    无头浏览器简介 无头浏览器(Headless Browser)是一种没有图形用户界面的浏览器,它在后台运行,不会显示任何窗口或界面.无头浏览器通常用于自动化任务,如网页抓取.自动化测试和性能监控等. ...

  10. osmts:OERV之一站式管理测试脚本

      最近团队里面实习的小伙伴开发了一个新的项目,可以用来一键式运行各种测试脚本并且完成数据总结,我也尝试部署了一下,遇到了一些问题,接下来一起解析一下这个项目.   首先是获取osmts git cl ...