[CF161D]Distance in Tree-树状dp
Problem Distance in tree
题目大意
给出一棵树,求这棵树上有多少个最短距离为k的点对。
Solution
这个题目可以用点分治来做,然而我到现在还是没有学会点分治,所以只好用树形dp了。
这个题目,我们可以将其转化为一个个子树中搞事情,再慢慢合并。
设f[i][j]为以i为根的子树中距离根距离为j的点有多少个。
对于一个点u,我们枚举它的子节点v,则我们可以计算出经过u-v这条边的答案
我们枚举j=1->k,则ans+=f[u][j]*f[v][k-j-1];
枚举完以后,我们将这一棵子树合并到u节点去,以便统计u的其它子树。
具体过程我们只需要dfs一遍,对于每个叶子结点x,f[x][0]=1。
然后不断向上回溯,边回溯边进行如上计算,最后即可算出正确答案。
具体可以参考一下代码。
AC Code
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
int to,next;
}e[];
int n,k,u,v,ans=,tot=;
int h[],f[][];
void add(int u,int v){
e[++tot].to=u;e[tot].next=h[v];h[v]=tot;
e[++tot].to=v;e[tot].next=h[u];h[u]=tot;
}
void dfs(int x,int last){
f[x][]=;
for(int i=h[x];~i;i=e[i].next){
if(e[i].to!=last){
dfs(e[i].to,x);
for(int j=;j<k;j++)ans+=f[x][j]*f[e[i].to][k-j-];
for(int j=;j<=k;j++)f[x][j]+=f[e[i].to][j-];
}
}
}
int main(){
// freopen("cf161d.in","r",stdin);
memset(h,-,sizeof(h));
scanf("%d%d",&n,&k);
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
dfs(,);
printf("%d",ans);
}

1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5 struct node{
6 int next,to;
7 }e[200010];
8 bool neko[100010];
9 int n,m,d,x,u,v,path[100010],h[100010],ans=0,tot=0;
10 int pathp[100010],pathn[100010];
11 void add(int u,int v){
12 e[++tot].to=u;e[tot].next=h[v];h[v]=tot;
13 e[++tot].to=v;e[tot].next=h[u];h[u]=tot;
14 }
15 void dfspath(int x,int last){
16 path[x]=-2333333;pathp[x]=-2333333;
17 for(int i=h[x];~i;i=e[i].next){
18 if(e[i].to!=last){
19 dfspath(e[i].to,x);
20 if(path[x]<path[e[i].to]+1){
21 pathp[x]=path[x];
22 path[x]=path[e[i].to]+1;
23 pathn[x]=e[i].to;
24 }else if(pathp[x]<path[e[i].to]+1)pathp[x]=path[e[i].to]+1;
25 }
26 }
27 if(neko[x]&&path[x]<-2000000)path[x]=0;
28 if(neko[x]&&pathp[x]<-2000000)pathp[x]=0;
29 }
30 void dpdfs(int x,int last){
31 if(~last)
32 if(pathn[last]==x){
33 if(pathp[last]+1>path[x]){
34 pathp[x]=path[x];
35 path[x]=pathp[last]+1;
36 pathn[x]=0;
37 }else if(pathp[last]+1>pathp[x])pathp[x]=pathp[last]+1;
38 }else{
39 if(path[last]+1>path[x]){
40 pathp[x]=path[x];
41 path[x]=path[last]+1;
42 pathn[x]=0;
43 }else if(path[last]+1>pathp[x])
44 pathp[x]=path[last]+1;
45 }
46 if(path[x]<=d)ans++;
47 for(int i=h[x];~i;i=e[i].next)
48 if(e[i].to!=last)dpdfs(e[i].to,x);
49 }
50 int main(){
51 // freopen("cf337d.in","r",stdin);
52 memset(h,-1,sizeof(h));
53 scanf("%d%d%d",&n,&m,&d);
54 for(int i=1;i<=m;i++)
55 scanf("%d",&x),neko[x]=1;
56 for(int i=1;i<n;i++){
57 scanf("%d%d",&u,&v);
58 add(u,v);
59 }
60 dfspath(1,1);
61 dpdfs(1,-1);
62 printf("%d",ans);
63 }

[CF161D]Distance in Tree-树状dp的更多相关文章
- poj2486--Apple Tree(树状dp)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7789 Accepted: 2606 Descri ...
- Codeforces 161D Distance in Tree(树型DP)
题目链接 Distance in Tree $k <= 500$ 这个条件十分重要. 设$f[i][j]$为以$i$为子树,所有后代中相对深度为$j$的结点个数. 状态转移的时候,一个结点的信息 ...
- POJ 2486 Apple Tree [树状DP]
题目:一棵树,每个结点上都有一些苹果,且相邻两个结点间的距离为1.一个人从根节点(编号为1)开始走,一共可以走k步,问最多可以吃多少苹果. 思路:这里给出数组的定义: dp[0][x][j] 为从结点 ...
- CodeForces 160D - Distance in Tree 树型DP
题目给了512MB的空间....用dp[k][i]代表以k为起点...往下面走(走直的不打岔)i步能有多少方案....在更新dp[k][i]过程中同时统计答案.. Program: #include& ...
- Codeforces 461B - Appleman and Tree 树状DP
一棵树上有K个黑色节点,剩余节点都为白色,将其划分成K个子树,使得每棵树上都仅仅有1个黑色节点,共同拥有多少种划分方案. 个人感觉这题比較难. 如果dp(i,0..1)代表的是以i为根节点的子树种有0 ...
- D. Distance in Tree(树型Dp计数)
\(其实思路都能想到一点,就是去重这里特别麻烦,没有好的思路.\) \(设dp[i][j]为以i为根深度为j的节点数量\) \(dp[parent][j]=\sum{dp[son][j-1]}\) \ ...
- HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)
Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...
- 树状DP (poj 2342)
题目:Anniversary party 题意:给出N各节点的快乐指数,以及父子关系,求最大快乐指数和(没人职员愿意跟直接上司一起玩): 思路:从底向上的树状DP: 第一种情况:第i个员工不参与,F[ ...
- poj3659树状DP
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6273 Accepted: 225 ...
- hdu 1561 The more, The Better_树状dp
题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...
随机推荐
- python爬虫从入门到放弃(七)之 PyQuery库的使用
PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...
- SQL语句集锦
-语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 ...
- 一步一步实现基于GPU的pathtracer(一):基础
出于3D计算机图形学和图形渲染方面的个人兴趣,脑子里便萌生出了自己实现一个渲染器的想法,主要是借助pathtracing这种简单的算法,外加GPU加速来实现,同时也希望感兴趣的朋友们能够喜欢,也欢迎提 ...
- SQL数据库的多表查询
多表查询分为 内.外连接 外连接分为左连接(left join 或left outer join).右连接(right join 或者 right outer join).和完整外部连接 (full ...
- 微信小程序 - 自定义创建
自定义创建与默认创建完全相同, 只是不要勾选quick start即可 淡定(不要看到报错就紧张, 一定要淡定) 看看它说了什么, no such file or directory(没有文件或目录) ...
- Vulkan Tutorial 19 Vertex input description
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在接下来几个章节中,我们将会使用内存顶点缓冲区来替换之前硬 ...
- OFFICE 文档转换为html在线预览
OFFICE 文档在线预览方案很多: 服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览,比如flexpaper Office文档直接转换为SWF,通过网页加载Flash预览 微软的 ...
- Tomcat7的热部署
所谓热部署就是在tomcat不停机的情况下,将新的war包放上去,达到服务不中断,用户无察觉的目的,实现的原理很简单,这里做下记录,以便后期查看. 1.1 安装tomcat7 略 1.2 在tomca ...
- Python爬虫从入门到放弃(十)之 关于深度优先和广度优先
网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据 ...
- win 10 开机后无法显示桌面
我整理了几种方法,可以试一下 1> win + x 然后运行explorer.exe 2> 1/// shift + ctrl + esc 进入 任务管理器 2/// 点击 ...

