首页 > 其他 > 详细

D. Distance in Tree

时间:2021-03-13 12:03:49      阅读:22      评论:0      收藏:0      [点我收藏+]

题目链接:http://codeforces.com/contest/161/problem/D

题意:求所有距离为k的点对(u,v) 的数量

思路:dp[u][i] 代表以u为根的子树 距离为i 的数量,  主要是考虑如何不重复的计算

可以先把每一棵子树的先记录 用乘法,然后再把贡献放到u上,每次保证通过子树的某一条边

来做到不重不漏

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5e4+10;
 4 const int mod=1e9+7;
 5 #define ll long long
 6 #define ull unsigned long long
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 #define pb push_back
11 #define ull unsigned long long
12 ll ans;
13 ll dp[maxn][505];
14 int n,k;
15 vector<int>E[maxn];
16 
17 
18 void dfs(int u,int fa)
19 {
20     dp[u][0]=1;
21     for(auto &v:E[u])
22     {
23         if(v==fa) continue;
24         dfs(v,u);
25         for(int i=0;i<k;i++)
26             ans+=dp[v][k-1-i]*dp[u][i];
27         for(int i=1;i<=k;i++)
28             dp[u][i]+=dp[v][i-1];
29     }
30 }
31 
32 int main()
33 {
34     ios::sync_with_stdio(0);
35     cin.tie(0);
36     cin>>n>>k;
37     for(int i=1;i<n;i++)
38     {
39         int x,y;
40         cin>>x>>y;
41         E[x].pb(y);
42         E[y].pb(x);
43     }
44     dfs(1,0);
45     cout<<ans<<\n;
46 
47 
48 
49 
50 }
View Code

 

D. Distance in Tree

原文:https://www.cnblogs.com/winfor/p/14527975.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!