https://codeforces.com/problemset/problem/161/D
题意:给一棵树,求树上距离为k的节点对的数量。
思路:树上dp,随便找个节点开始遍历。然后枚举当前点的距离为i的节点数与当前点的孩子节点距离为k - i - 1的节点数相乘。
总结:想到了树上dp,也想到了这个思路,但是没想到相乘跟开始遍历的节点值,以及为什么这种遍历可以保证节点对不重复。
void solve(){
int n, k;
cin >> n >> k;
vector<vector<int>> al(n);
for (int i = 0; i < n - 1; ++i){
int u, v;
cin >> u >> v;
u --;
v --;
al[u].emplace_back(v);
al[v].emplace_back(u);
}
long long ans = 0;
vector<vector<long long>> dp(n, vector<long long>(k, 0ll));
function<void(int, int)> dfs = [&](int u, int p){
dp[u][0] = 1;
for (const int& v : al[u]){
if (v != p){
dfs(v, u);
for (int i = 0; i < k; ++i){
ans += dp[u][i] * dp[v][k - i - 1];
}
for (int i = 1; i < k; ++i){
dp[u][i] += dp[v][i - 1];
}
}
}
};
dfs(0, -1);
cout << ans << '\n';
}
标签:Distance,int,Tree,al,dfs,++,节点,dp
From: https://www.cnblogs.com/yxcblogs/p/18165712