题目大意:给一棵树,求树上两点之间距离为K的点对数目。
方程含义:
dp(i,j)表示从已经遍历过的点到当前点i,路径长度为 j 的路径条数。因此,对于当前点,每当遍历了其中一个儿子节点的时候,首先统计当前情况下的结果,然后要更新dp(i, j)
初始条件dp(i,0)= 1
#include <cstdio> #include <cstring> #include <vector> using namespace std; #define N 50005 vector<int> g[N]; int dp[N][505], n, k, ans; void dfs(int now, int fa) { for (int i=1; i<=k; i++) dp[now][i] = 0; dp[now][0] = 1; int u; for (int i=0; i<g[now].size(); i++) { u = g[now][i]; if (u == fa) continue; dfs(u, now); for (int j=0; j<k; j++) ans += dp[u][j]*dp[now][k-j-1]; for (int j=1; j<=k; j++) dp[now][j] += dp[u][j-1]; //更新当前的值 } } int main() { scanf("%d%d", &n, &k); int a, b; for (int i=1; i<n; i++) { scanf("%d%d", &a, &b); g[a].push_back(b); g[b].push_back(a); } ans = 0; dfs(1, 0); printf("%d ", ans); return 0; }