CF 161D Distance in Tree 树形DP
来源:互联网 发布:厂品商设计软件 编辑:程序博客网 时间:2024/05/16 08:29
题意:给出一个无根树,统计有多少节点对之前的距离恰好等于K。相邻节点间的距离为1.
思路:树形DP。
我们可以将无根树转化成有根树,这个很容易做到。
对于一个子树,其根结点为s,我们只需统计s的子树之间距离为K节点对即可。然后对每个子树都进行相同的统计,就可以得到最终的答案。
因为这些节点对是经过根结点s,所以他们和根结点的距离之和就是K。所以我们要知道在以s为根的子树下,有多少个距离为i的节点。然后在利用计数的乘法原理就可以了。
但是还要考虑的一个问题是如何去重。只是简单的统计出节点s的所有儿子的距离分布,会让我们丧失太多的信息,因为我们不知道这些儿子位于哪棵子树中。因为求节点s的所有儿子的距离的时候,是按照一个一个子树来求的,这个过程已经非常自然的帮我们把子树划分开。所以,我们要在这个过程中先求出当前子树和前面所有子树产生了多少满足条件的节点对,再把当前子树的节点加入到根结点上。
#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAX = 50010;int N,K;int to[MAX*2],nxt[MAX*2],head[MAX],tot;long long s[50010][510];void init(){ memset(head,-1,sizeof(head)); tot = 0;}void addedge(int u, int v){ to[tot] = v, nxt[tot] = head[u]; head[u] = tot++; to[tot] = u, nxt[tot] = head[v]; head[v] = tot++;}long long dfs(int u, int p){ s[u][0] = 1; long long ans = 0; for(int i = head[u]; ~i ; i = nxt[i]){ int v = to[i]; if(p == v) continue; ans += dfs(v,u); for(int i = 0; i < K; ++i) ans += s[u][i] * s[v][K - i - 1]; for(int i = 1; i < K; ++i) s[u][i] += s[v][i-1]; } return ans;}int main(void){ //freopen("input.txt","r",stdin); init(); scanf("%d%d",&N,&K); for(int i = 0; i < N - 1; ++i){ int u, v; scanf("%d%d",&u,&v); addedge(u,v); } printf("%I64d\n",dfs(1,0)); return 0;}
0 0
- CF 161D Distance in Tree 树形DP
- CF 161D Distance in Tree 树形DP(套路,路径长度为k点对)
- codeforces 161D D. Distance in Tree(树形dp)
- CF 161D Distance in Tree【树DP】
- codeforces 161D Distance in Tree(树形dp)
- codeforces 161D - Distance in Tree(树形dp)
- CodeForces 161D Distance in Tree(树形DP)
- codeforces 161D Distance in Tree (树形DP 经典题)
- CodeForces 161D Distance in Tree 树形DP
- Codeforces 161 D Distance in Tree 树形DP
- CF-161D Distance in Tree
- CodeForces 160D - Distance in Tree 树形DP
- 树形DP 统计树中长度为K的路径数量 CodeForces 161D Distance in Tree
- 树形DP 统计树中长度为K的路径数量 CodeForces 161D Distance in Tree
- [树形DP]VK Cup 2012 Round 1 D. Distance in Tree
- codeforces 161D. Distance in Tree(树dp)
- codeforces 161D - Distance in Tree 树状DP
- 树形DP入门题 cf 161D
- 2014年秋 求职总结
- SDK manager 中 Done loading packages 问题
- Codeforces Round #288 (Div. 2) D. Tanya and Password
- MongoDB入门(三)-Java操作MongoDB
- 小寒假第二天总结
- CF 161D Distance in Tree 树形DP
- 调试struts2两种方法之配置插件和使用Debugging Interceptor
- MySQL安装之后没有MySQL数据库的原因
- Android学习笔记 - 杂
- golang todo实例
- hdu 5014 亦或的性质
- PrinterWriter 类入门
- Path Sum
- POJ 1087 A Plug for UNIX(最大流dinic)