树形DP 统计树中长度为K的路径数量——Distance in Tree
一、问题描述
给出一棵n个节点的树,统计树中长度为k的路径的条数(1<=n<=50000 , 1<=k<=500)。
二、解题思路
设d[i][k]表示以i为根节点长度为k的路径数目
三、代码实现
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<vector> 6 using namespace std; 7 8 const int maxn = 50000 + 10; 9 const int maxk = 500 + 10; 10 vector<int>G[maxn]; 11 int d[maxn][maxk],ans; 12 int n; 13 14 void init() 15 { 16 ans = 0; 17 memset(d, 0, sizeof(d)); 18 for (int i = 0; i <= n; i++) G[i].clear(); 19 } 20 21 void dfs(int root, int fa, int k) 22 { 23 d[root][0] = 1; 24 for (int i = 0; i < (int)G[root].size(); i++) 25 { 26 int son = G[root][i]; 27 if (son == fa) continue; //无向图,注意保持dfs的方向 28 dfs(son, root, k); 29 for (int j = 0; j < k; j++) ans += d[son][j] * d[root][k - 1 - j]; 30 for (int j = 1; j <= k; j++) d[root][j] += d[son][j - 1]; 31 } 32 } 33 34 35 int main() 36 { 37 int k; 38 while (scanf("%d%d",&n,&k) == 2) 39 { 40 int a, b; 41 init(); 42 for (int i = 0; i < n - 1; i++) 43 { 44 scanf("%d%d", &a, &b); 45 G[a].push_back(b); 46 G[b].push_back(a); 47 } 48 dfs(1, 0, k); 49 printf("%d\n", ans); 50 } 51 return 0; 52 }
个性签名:时间会解决一切