传送门

题目大意:

一棵树上有一个特殊点,特殊点可以影响距离小于等于d的点,现在告诉被影响的点,问特殊点可以在几个点上。

题目分析:

对题意进行转化:求到被影响点的最大距离小于等于d的点数目。

然后就可以进行树型dp,求最大距离需要进行两次dp,第一次子树向父节点传递有用信息,第二字父节点向子树传递有用信息。dp[u][1]表示u距离以该节点为根的子树中的被影响点的最大距离,dp[u][0]表示u距离该子树外的被影响点的最大距离。

\[第一次: dp[u][1] = max\{dp[v][1]\} + 1
\]

\[第二次: dp[v][0] = max(dp[u][0] + 1, max\{dp[u][1\} + 2)
\]

其中第二次中的max{dp[u][1} + 2)如果正是从v转移来的,就取次大值。

初始化如果该节点就是被影响的点那么距离为0,否则为-1。注意当dp之中出现了-1时要进行各种特判。

code

#include<bits/stdc++.h>
using namespace std; const int N = 1e5 + 5;
int n, m, d, dp[N][2], ans;
bool mark[N];
vector<int> adj[N]; inline void dfs1(int u, int f){
int maxDisDown = -1;
dp[u][1] = mark[u] ? 0 : -1;
for(int i = adj[u].size()-1; i >= 0; i--){
int v = adj[u][i];
if(v == f) continue;
dfs1(v, u);
maxDisDown = max(maxDisDown, dp[v][1]);
}
if(maxDisDown != -1)
dp[u][1] = max(dp[u][1], maxDisDown + 1);
} inline void dfs2(int u, int f){
int mx1 = -1, mx2 = -1;
for(int i = adj[u].size()-1; i >= 0; i--){
int v = adj[u][i];
if(v == f) continue;
if(dp[v][1] > mx1){
mx2 = mx1;
mx1 = dp[v][1];
}
else if(dp[v][1] > mx2){
mx2 = dp[v][1];
}
} for(int i = adj[u].size()-1; i >= 0; i--){
int v = adj[u][i];
if(v == f) continue;
int siblingDis = dp[v][1] == mx1 ? mx2 : mx1;
if(siblingDis != -1)
siblingDis += 2;
dp[v][0] = siblingDis;
if(dp[u][0] != -1)
dp[v][0] = max(dp[v][0], dp[u][0] + 1);
if(mark[v])
dp[v][0] = max(dp[v][0], 0);
dfs2(v, u);
}
} int main(){
// freopen("h.in", "r", stdin);
scanf("%d%d%d", &n, &m, &d);
for(int i = 1; i <= m; i++){
int x; scanf("%d", &x);
mark[x] = true;
}
for(int i = 1; i < n; i++){
int x, y; scanf("%d%d", &x, &y);
adj[x].push_back(y), adj[y].push_back(x);
}
dfs1(1, 0);
dp[1][0] = mark[1] ? 0 : -1;
dfs2(1, 0); for(int i = 1; i <= n; i++)
ans += dp[i][0] <= d && dp[i][1] <= d ? 1 : 0;
printf("%d", ans);
return 0;
}

最新文章

  1. SharePoint 2010 数据库xxx的事务日志已满
  2. Xms Xmx PermSize MaxPermSize 区别
  3. hive 普通创建表和跟新列操作
  4. Java实现归并排序
  5. SQL关于limit的用法
  6. JNI技术概念小结
  7. UML——综合实例
  8. 51nod1079中国剩余定理
  9. DES、AES、TEA加密算法的比较
  10. C语言可变长參数实现原理
  11. Thread部分总结以及小例子
  12. IO 模型 IO 多路复用
  13. PowerDesigner反向生成PDM和name与注释互换
  14. 关于surface gradient
  15. centos7 mysql数据库安装和配置(转, 未验证)
  16. 【4】JMicro微服务-服务限流
  17. django1.8forms读书笔记
  18. JSP Servlet中Request与Response所有成员方法的研究
  19. PDF文件比对工具
  20. Vue语法笔记

热门文章

  1. 开发板 Linux驱动视频 驱动是什么
  2. Java基础学习总结(52)——Liunx系统Centos上搭建Java开发环境
  3. iOS_07_流程控制
  4. jmeter--使用badboy录制脚本
  5. 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs
  6. [D3] Make D3 v4 Charts Responsive with the viewBox attribute
  7. Android ServiceManager启动
  8. Hadoop读书笔记(一)Hadoop介绍
  9. OC学习篇之---协议的概念和用法
  10. Android layer-list的属性和使用具体解释