树形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 }

猜你喜欢

转载自www.cnblogs.com/lfri/p/9486561.html