我是靠谱客的博主 神勇草莓,这篇文章主要介绍codeforces 161D D. Distance in Tree(树形dp),现在分享给大家,希望可以做个参考。

题目链接:

codeforces 161D


题目大意:

给出一棵树,每条边的边权是1,问两点之间的路径长度为k的点对有多少个?


题目分析:

  • 定义状态dp[i][k]代表以i为根的子树中的点到达点i的长度为k的点的个数。定义V为与u相邻的点的集合,p是u的父亲
  • 然后转移方程很简单:
    dp[u][j]=vVdp[v][j1]
  • 然后我们利用处理出来的dp数组可以再做一个操作,将它变成点i到所有点中路径长度等于k的个数。
  • 转移方程如下:
    dp[u][j]+=dp[p][j1]dp[u][j2]
  • 就是因为父亲已经被维护过,所以现在dp[p][j-1]表示p点到所有点中长度为k的点的个数,再减去那些存在于当前子树中的点,然后就是非u的子树中的点到u的距离为j的点的个数,最后枚举每个点,统计他们 ni=1dp[u][k] ,因为每条符合要求的路径算了两次,所以最后结果要除以2。

AC代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <algorithm> #define MAX 50007 using namespace std; typedef long long LL; int n,k,a,b; LL dp[MAX][507],ans; vector<int> e[MAX]; void add ( int u , int v ) { e[u].push_back ( v ); e[v].push_back ( u ); } void Clear ( ) { for ( int i = 0 ; i < MAX ; i++ ) e[i].clear(); } void dfs ( int u , int p ) { dp[u][0] = 1; for ( int i = 1 ; i <= k ; i++ ) dp[u][i] = 0; for ( int i = 0 ; i < e[u].size() ; i++ ) { int v = e[u][i]; if ( v == p ) continue; dfs ( v , u ); for ( int j = 1 ; j <= k ; j++ ) dp[u][j] += dp[v][j-1]; } } void solve ( int u , int p ) { for ( int i = 0 ; i < e[u].size() ; i++ ) { int v = e[u][i]; if ( v == p ) continue; for ( int j = k; j >= 1 ; j-- ) { dp[v][j] += dp[u][j-1]; if ( j > 1 ) dp[v][j] -= dp[v][j-2]; } solve ( v , u ); } } int main ( ) { while ( ~scanf ( "%d%d" , &n , &k ) ) { Clear(); for ( int i = 1 ; i < n ; i++ ) { scanf ( "%d%d" , &a , &b ); add ( a , b ); } ans = 0; dfs ( 1 , -1 ); solve ( 1 , -1 ); /*for ( int i = 1; i <= n ; i++ ) for ( int j = 0 ; j <= k ; j++ ) cout << i << " " << j << " " << dp[i][j] << endl;*/ for ( int i = 1 ; i <= n ; i++ ) ans += dp[i][k]; printf ( "%I64dn" , ans/2LL ); } }

最后

以上就是神勇草莓最近收集整理的关于codeforces 161D D. Distance in Tree(树形dp)的全部内容,更多相关codeforces内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部