Book of Evil,有一颗树,n个节点,有m个节点被标记,问n个节点中,有多少个节点,这些节点与这m个节点的最远的距离小于等于d。

用down[i], up[i]分别标记只考虑以i为root的子树的情况与这颗补集并上节点i的情况,两遍dfs,第一遍dfs求出down数组,第二遍求up数组,求up时,需要考虑当前节点i的父亲节点的up值以及节点i的兄弟节点的down值,然后取最大值。在求兄弟们的最大值时,由于所有的兄弟都会有这样的操作,因此可以先求出最大和次大,如果当前节点i的down值不是最大的,那么最大的一定在兄弟中,否则次大的一定是兄弟中最大的。

PS: 还个算法,可以先求出树中离得最远的两个带标记的节点,枚举树中的节点,若节点与这两个节点的距离小于等于d,则统计。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; const int MAXN = ;
const int INF = 1e9; int down[MAXN], up[MAXN];
int max1[MAXN], max2[MAXN];
bool p[MAXN]; vector<vector<int> > tree; void dfs1(int u, int f) {
down[u] = p[u] ? : -INF;
max1[u] = max2[u] = -INF;
for (int i = ; i < tree[u].size(); i++) {
int v = tree[u][i];
if (v != f) {
dfs1(v, u);
down[u] = max(down[u], down[v] + );
if (down[v] > max1[u]) {
max2[u] = max1[u];
max1[u] = down[v];
} else if (down[v] > max2[u]) {
max2[u] = down[v];
}
}
}
} void dfs2(int u, int f) {
up[u] = p[u] ? : -INF;
if (f != -) {
up[u] = max(up[u], up[f] + );
int slide;
if (down[u] < max1[f]) {
slide = max1[f] + ;
} else {
slide = max2[f] + ;
}
up[u] = max(up[u], slide);
} for (int i = ; i < tree[u].size(); i++) {
int v = tree[u][i];
if (v != f) {
dfs2(v, u);
}
}
} int main() {
int n, m, d;
scanf("%d%d%d", &n, &m, &d);
memset(p, false, sizeof(p));
for (int i = ; i < m; i++) {
int t;
scanf("%d", &t);
p[t] = true;
}
tree.resize(n + );
for (int i = ; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
tree[a].push_back(b);
tree[b].push_back(a);
} dfs1(, -);
dfs2(, -); int ans = ;
for (int i = ; i <= n; i++) {
if (max(down[i], up[i]) <= d) {
ans++;
}
} printf("%d\n", ans);
}

最新文章

  1. EntityFramework 性能优化
  2. linux项目-之系统安装部署-cobbler
  3. javascript继承扩展类方法实现
  4. linux 查看文件命令总结
  5. Android WebView Error – Uncaught TypeError: Cannot call method ‘getItem’ of null at
  6. POJ3692 Kindergarten 【最大独立集】
  7. skynet newservice API参考
  8. Multidimensional Array And an Array of Arrays
  9. C# .NET更智能的数据库操作的封装
  10. Spring Cloud中负载均衡器概览
  11. Unity 3D 之贪吃蛇 Text 心得 &amp; Audio
  12. 连续多次调用inet_ntoa()结果重复
  13. 【腾讯Bugly干货分享】经典随机Crash之一:线程安全
  14. java 关于打断点
  15. Java 对远程文件的操作
  16. a标签与js的冲突
  17. hive内group by取第一条数据,Hive中row_number的使用
  18. asp.net core自定义模型验证——前端验证
  19. SSM搭建Spring单元测试环境
  20. Codeforces Beta Round #94 div2 D 优先队列

热门文章

  1. 服务器发布WebService返回DataTable
  2. Maven Dependency Scope用法
  3. Linux dd 命令
  4. H5 适配 动画animation js touch
  5. linux命令 chattr超级权限控件
  6. YII千万级PV架构经验分享--理论篇
  7. vim使用大全
  8. 1078. Hashing (25)
  9. sybase convert 函数
  10. NSInvocation的使用(转)