树形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 }