Problem - 161D - Codeforces 经典树形dp
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
long long f[N][N];//以i为根的子树中离i距离为j的点的个数
int n,k;
vector<int> ve[N];
long long res=0;
void dfs(int u,int fa){
f[u][0]=1;//自身距离为0
for(int i=0;i<(int)ve[u].size();i++){
int v=ve[u][i];
if(v==fa) continue;
dfs(v,u);
for(int j=0;j<k;j++) res+=f[u][j]*f[v][k-j-1];
//为什么要k-j-1,因为还有k到v的距离1,所以还要-1
for(int j=0;j<k;j++) f[u][j+1]+=f[v][j];
//更新每个点到距离的个数
}
}
int main(){
scanf("%d %d",&n,&k);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
ve[a].push_back(b);
ve[b].push_back(a);
}
dfs(1,-1);
printf("%lld\n",res);
return 0 - 0;
}