JSOI2018 潜入行动

题目描述

外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻。

在黄金舰队就位之前,JYY 打算事先了解外星人的进攻计划。现在,携带了监听设备的特工已经秘密潜入了外星人的母舰,准备对外星人的通信实施监听。

外星人的母舰可以看成是一棵 nn 个节点、 n-1n−1 条边的无向树,树上的节点用 1,2,\cdots,n1,2,⋯,n 编号。JYY 的特工已经装备了隐形模块,可以在外星人母舰中不受限制地活动,可以神不知鬼不觉地在节点上安装监听设备。

如果在节点 uu 上安装监听设备,则 JYY 能够监听与 uu 直接相邻所有的节点的通信。换言之,如果在节点 uu 安装监听设备,则对于树中每一条边 (u,v)(u,v) ,节点 vv 都会被监听。特别注意放置在节点 uu 的监听设备并不监听 uu 本身的通信,这是 JYY 特别为了防止外星人察觉部署的战术。

JYY 的特工一共携带了 kk 个监听设备,现在 JYY 想知道,有多少种不同的放置监听设备的方法,能够使得母舰上所有节点的通信都被监听?为了避免浪费,每个节点至多只能安装一个监听设备,且监听设备必须被用完。

输入输出格式

输入格式:
输入第一行包含两个整数 n,kn,k ,表示母舰节点的数量 nn 和监听设备的数量 kk 。 接下来 n-1n−1 行,每行两个整数 u,vu,v (1\le u,v\le n)(1≤u,v≤n) ,表示树中的一条边。

输出格式:
输出一行,表示满足条件的方案数。因为答案可能很大,你只需要输出答案 \text{mod 1,000,000,007}mod 1,000,000,007 的余数即可。

题目传送门

我看见有帅哥说这道题是简单的树形dp 。。。有点沉默

设 f[i][j][0/1][0/1] f[i][j][0/1][0/1] 表示i的子树中已安装j个装置, i是/否安装,是/否被控制的方案数, 方程过长懒得解释,这道题难就难在要打的东西太多很容易出错

然后要注意,很容易爆空间和时间,数组开int,虽然dp过程中会爆int,但是数组要开int不然会爆,然后在dp的时候强制转long long。 这个地方我调试了好久

#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
const int mod=1e9+7;
int N,K,f[100010][105][2][2],size[100010],front[100010];long long g[105][2][2];
struct tEdge{int v,next;tEdge(int v=0,int next=0) : v(v) , next(next) {}
}e[200020];
void add(int u,int v)
{static int tcnt=0;e[++tcnt]=tEdge(v,front[u]);front[u]=tcnt;
}
int mo(int &a,ll b){return (a+((int)(b%mod)))%mod;
}
void dfs(int u,int fa){size[u]=1;f[u][0][0][0]=f[u][1][1][0]=1;for(int i=front[u];i;i=e[i].next){int v=e[i].v;if(v==fa)continue;dfs(v,u);for(int i=0;i<=min(size[u],K);++i){g[i][0][0]=f[u][i][0][0],f[u][i][0][0]=0;g[i][0][1]=f[u][i][0][1],f[u][i][0][1]=0;g[i][1][0]=f[u][i][1][0],f[u][i][1][0]=0;g[i][1][1]=f[u][i][1][1],f[u][i][1][1]=0;}for(int i=0;i<=min(size[u],K);++i)for(int j=0;j<=min(size[v],K-i);++j){f[u][i+j][0][0]=mo(f[u][i+j][0][0],(ll)g[i][0][0]*(ll)f[v][j][0][1]);f[u][i+j][1][0]=mo(f[u][i+j][1][0],(ll)g[i][1][0]*(ll)(f[v][j][0][0]+f[v][j][0][1]));f[u][i+j][0][1]=mo(f[u][i+j][0][1],(ll)g[i][0][0]*(ll)f[v][j][1][1]+(ll)g[i][0][1]*(ll)(f[v][j][0][1]+f[v][j][1][1]));f[u][i+j][1][1]=mo(f[u][i+j][1][1],(ll)g[i][1][0]*(ll)(f[v][j][1][1]+f[v][j][1][0])+(ll)g[i][1][1]*(ll)((ll)(f[v][j][0][0]+f[v][j][0][1])+(ll)(f[v][j][1][1]+f[v][j][1][0])));}size[u]+=size[v];}
}
main(){scanf("%d%d",&N,&K);for(int i=1;i<N;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);}dfs(1,0);printf("%d\n",(f[1][K][1][1]+f[1][K][0][1])%mod);return 0;
}

树形dp进阶题2 JSOI2018潜入行动相关推荐

  1. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  2. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  3. 洛谷P1352 没有上司的舞会(树形DP水题)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  4. 树形dp瞎讲+树形dp基础题题解

    ---恢复内容开始--- 没错 咕了这么久(没有青青姐久 我又开始写博客了( ´▽`) 想了很久些什么(才没有想过呢 虽然被鄙视基础不好但还是走上了树形dp的不归路 那么 就来写写树形dp吧(dtx ...

  5. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  6. POJ3345 Bribing FIPA 【背包类树形dp】

    题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...

  7. 2018.09.01 独立集(树形dp)

    描述 给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K.求这个集合节点最多是多少 输入 第一行是两个整数N,K 接下来是N-1行,每行2个整数x,y,表示x与y有一 ...

  8. HDU 1520 Anniversary party(树形dp)

    HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...

  9. bzoj 2427: [HAOI2010]软件安装(Trajan+树形DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1844  Solved: 723 [Submit][Sta ...

最新文章

  1. python3项目-python3搭建Django项目
  2. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
  3. 存在于实数域的微观粒子5-可分类性
  4. 迎接100G数据中心以太网
  5. 启动过滤器异常 java.lang.AbstractMethodError: ‘void javax.servlet.Filter.init(javax.servlet.FilterConfig)‘
  6. 深圳农村商业银行转账显示服务器无响应,深圳农村商业银行
  7. OutOfMemory (OOM)的类型与检测
  8. 您的Apache Camel应用程序现在包括现成的文档
  9. 不root的情况下 查看App的数据表
  10. android获取有线、wifi、3G(4G)的IP
  11. linux忘记管理员密码,如何登陆?
  12. 190521每日一句
  13. 七年级计算机上教学计划,新人教版七年级数学下册教学计划(精选5篇)
  14. qq服务器正在升级维护中,建议您稍后再尝试打开.谢谢!,用友通维护锦集
  15. 如何给这些textbox中赋值
  16. CH9102国产USB转高速串口芯片兼容替代CP2102
  17. 民营企业该如何留住人才
  18. 关于write和read以及文件读写位置
  19. 全面剖析canonical标签
  20. php 表格序号,excel自动生成序号、编号

热门文章

  1. Linux下Socket相关头文件总结
  2. 发布全部开源的Asp.net 2.0 RBAC 权限管理系统了,大家支持下。
  3. leetcode59螺旋矩阵II + 54螺旋矩阵 + 48旋转图像
  4. C++ std::mutex 与 const函数
  5. 机房收费系统之纵观全局
  6. 分治法、动态规划法、回溯法、贪心法简单叙述
  7. 分享Python采集79个NET其他类别源码,总有一款适合您
  8. 华为Freebuds 5i左右耳电量不一样是为什么?
  9. C3P0连接池jar包下载
  10. OJ Problem D: 哪一天,哪一秒?