Distance in Tree

来源:互联网 发布:limit mysql 优化 编辑:程序博客网 时间:2024/06/09 20:21

http://codeforces.com/problemset/problem/161/D

//dp[i][j]表示以i节点为端点 且 长度为j的种数 #include<stdio.h>#include<string.h>#include<vector>using namespace std;int n,k;const int maxn=50006;typedef long long lld;int dp[maxn][505];lld ans;vector<int>edge[maxn];void DFS(int u,int f){int i,j,v;int sz=edge[u].size();dp[u][0]++;for(i=0;i<sz;i++){v=edge[u][i];if(f==v)continue;DFS(v,u);for(j=0;j<k;j++)ans+=(lld)dp[v][j]*dp[u][k-j-1];//计算长度为k的种数for(j=0;j<=k;j++)dp[u][j+1]+=dp[v][j];//转移}}int main(){int i,j;int u,v;while(scanf("%d%d",&n,&k)!=EOF){for(i=0;i<=n;i++)edge[i].clear();memset(dp,0,sizeof(dp));for(i=1;i<n;i++){scanf("%d%d",&u,&v);edge[u].push_back(v);edge[v].push_back(u);}ans=0;DFS(1,1);printf("%lld\n",ans);}return 0;}