题意:

给定一棵无根树,要求给树上 \(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. MONGODB数据备份与导入

    主要记录下在mongo 3.0的操作 备份示例 ./mongodump -h localhost -d liongo -o ./ 还原示例 错误方式: ./mongorestore -h 127.0. ...

  2. 动态能力理论&知识管理理论--商业之所见

    动态能力理论:企业整合,建立和再配置内外部资源以适应快速变化环境的能力. (1)"动态"指的是适应不断变化的环境,企业必须具有不断更新自身能力的能力: (2)"能力&qu ...

  3. SMOTE算法解决样本不平衡

    首先,看下Smote算法之前,我们先看下当正负样本不均衡的时候,我们通常用的方法: 抽样 常规的包含过抽样.欠抽样.组合抽样 过抽样:将样本较少的一类sample补齐 欠抽样:将样本较多的一类samp ...

  4. Markdown 编写技巧汇总(二)

    继续上篇汇总 附-上篇汇总,接着做更加高级一点的应用技巧. [1]列表与引言嵌套 两者嵌套,如: > 我是一行文本 > 1. 文本1 > 2. 文本2 > 1. 文本 > ...

  5. Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境

    如何正确地用MinGW64编译与配置vscode的Opencv环境 1.前情提要 最近有关于图形学的授课,教授开始布置的上机打码的代码实现作业了.虽说教授为了让我们省心,直接就整了个环境已经配置好的几 ...

  6. 你好,新朋友:生成式AI的第一次对话

    像学习使用智能手机一样开启AI对话 一.从"第一次用智能手机"理解AI交互 还记得初次使用智能手机时的笨拙吗?滑动解锁.输入文字.下载应用-每一步都需要探索.生成式AI的对话也遵循 ...

  7. RVV1.0指令中关于_m系列函数的使用方法,即掩码mask的转换使用

    在RVV1.0指令函数的使用中,遇到了mask加载不匹配问题 uint8_t mask_data[] = {15, 0, 0, 0, 0, 0, 0, 0}; vbool8_t mask = vlm_ ...

  8. Ubuntu 22.04 添加 AppImage 到应用程序

    前言 AppImage 逐渐成为 Linux 常用的一种软件包格式,本文将介绍如何将 AppImage 文件添加到 Ubuntu 的应用程序中. 如下图中的 CAJViewer : 操作过程 设置相关 ...

  9. 【数值计算方法】蒙特卡洛方法积分的Python实现

    原理不做赘述,参见[数值计算方法]数值积分&微分-python实现 - FE-有限元鹰 - 博客园,直接上代码,只实现1d,2d积分,N维积分的蒙特卡洛方法也类似. 代码 from typin ...

  10. 【Jmatpro 10.0】根据材料牌号输出应力-应变曲线

    1.前提条件 Jmatpro 软件 一个材料牌号或者材料成分数据 2. 步骤 以 X15Cr 13牌号金属为案例 材料数据来自:材数库 运行jmatpro软件 选择 material type:sta ...