Codeforces 161D

树形DP:

要求找出树上距离为k的点的对数;

对于每个节点,经过这个节点的符合条件的的点有两种:

第一种:距离他为i的儿子和他爸爸中距离他爸爸为k-i-1;(不是符合的点对中的一个)

第二种:他儿子中距离为其儿子为k-1的点;(此节点为符合条件的点对中的一个)

 1 #include <cstdio>
 2 #include <vector>
 3 #define N 50009
 4 using namespace std;
 5 vector<int>vec[N];
 6 int dp[N][505];
 7 long long ans;
 8 void dfs(int x,int f,int k)
 9 {
10     dp[x][0]=1;
11     for(int i=0;i<vec[x].size();i++)
12     {
13         int q=vec[x][i];
14         if(q==f)continue;
15         dfs(q,x,k);
16         for(int j=0;j<k;j++)
17             ans+=dp[q][j]*dp[x][k-j-1];
18         for(int j=1;j<k;j++)
19             dp[x][j]+=dp[q][j-1];
20     }
21     ans+=dp[x][k];
22 }
23 int main()
24 {
25     int n,k,x,y;
26     scanf("%d%d",&n,&k);
27     for(int i=0;i<n-1;i++)
28     {
29         scanf("%d%d",&x,&y);
30         vec[x].push_back(y);
31         vec[y].push_back(x);
32     }
33     ans=0;
34     dfs(1,0,k);
35     printf("%lld",ans);
36     return 0;
37 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3354477.html