题意
求出树上距离为k的点对有多少个
思路
我们考虑计算出对于以u为根的子树中,距离u各种距离的节点的个数,这个值可以通过u的儿子v来更新
枚举与u距离j的点,因为要统计距离为k的点个数,于是我们还需要距离k−j的点,因为通过v转移 ,有一个距离1,所以只需要找与v距离k−j−1的点的个数,乘起来就可以了
dp[i][j] 表示距离这个点距离为j 的点的数量,通过枚举每一个点作为分支的根节点,复杂度n*k
code
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=5e4+10;
vector<int> G[maxn];
int dp[maxn][520];
int n,k;
int ans;
void dfs(int u,int fa){
dp[u][0]=1;
for(auto v:G[u]){
if(v==fa) continue;
dfs(v,u);
for(int i=0;i<k;i++){
ans+=dp[u][i]*dp[v][k-1-i];
if(i) dp[u][i]+=dp[v][i-1];
}
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
ans=0;
dfs(1,-1);
cout<<ans<<endl;
return 0;
}
学如逆水行舟,不进则退