概述
题目大意:给出一棵n个节点的树,统计树中长度为k的路径的条数(1<=n<=50000 ,1<=k<=500);
题目分析:设dp[i][j]表示以i作为长度为j的路径其中一个点的方案数。转移:dp[u][j]+=dp[v][j-1]; 方案计数:ans+=dp[v][j]*dp[u][k-j-1];
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #include<cmath> #include<cctype> #include<cassert> #include<climits> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForD(i,n) for(int i=n;i;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define RepD(i,n) for(int i=n;i>=0;i--) #define MEM(a) memset(a,0,sizeof(a)) #define MEMI(a) memset(a,127,sizeof(a)) #define MEMi(a) memset(a,128,sizeof(a)) #define INF (2139062143) #define phiF (1000000006) #define MAXN (1000000+10) typedef long long LL; struct info{ int to,next; }e[100005]; int tot,first[100005],dp[50005][505],k,ans,n,x,y; void add(int u,int v){ tot++; e[tot].to=v; e[tot].next=first[u]; first[u]=tot; } void dfs(int u,int fa){ dp[u][0]=1; for (int p=first[u];p;p=e[p].next){ int v=e[p].to; if (v==fa) continue; dfs(v,u); Rep (j,k) ans+=dp[v][j]*dp[u][k-j-1]; For (j,k) dp[u][j]+=dp[v][j-1]; } } int main(){ scanf("%d%d",&n,&k); For (i,n-1){ scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(1,0); printf("%d",ans); }
最后
以上就是斯文水壶为你收集整理的Codeforces 161 D Distance in Tree 树形DP的全部内容,希望文章能够帮你解决Codeforces 161 D Distance in Tree 树形DP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复