http://codeforces.com/contest/161/problem/D
树形dp,很优美,利用了树的性质和dfs回溯...
注意以防重复,所以要把计数提前到更新操作前
#define N 50005
LL dp[N][505];
vector<int> v[N];
LL ans = 0;
int n,k;
void dfs(int u,int fa){
int i;
dp[u][0] = 1;
for(i=0;i<v[u].size();i++){
if(v[u][i]!=fa){
dfs(v[u][i],u);
int j;
for(j=1;j<=k;j++){//计数提前
ans += dp[u][j-1]*dp[v[u][i]][k-j];
}
for(j=1;j<=k;j++){
dp[u][j] += dp[v[u][i]][j-1];
}
}
}
}
int main(){FRE;
cin>>n>>k;
int i;
for(i=1;i<n;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,1);
cout<<ans<<endl;
return 0;
}