题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量。

容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能是恶魔所在的点(虽然我也是没有证明凭感觉,逃~~)。

那么问题就难在怎么快速找到这m个点中距离最远的两个点?我们会想到这跟 找树的直径非常相似,于是就是用找树的直径的方法:树形dp找出这两个点。

然后距离这两个点的距离都小于等于d的就统计答案即可。

然后要注意m=1的情况。

细节请看代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,d,num,ans,rec,v[N];
vector<int> G[N]; int d1[N],d2[N],r1[N],r2[N];
void dfs1(int x,int fa) {
if (v[x]) d1[x]=,r1[x]=x;
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (y==fa) continue;
dfs1(y,x);
if (d1[y]+>=d1[x]) {
d2[x]=d1[x]; r2[x]=r1[x];
d1[x]=d1[y]+; r1[x]=r1[y];
}
else if (d1[y]+>d2[x]) {
d2[x]=d1[y]+; r2[x]=r1[y];
}
}
if (d1[x]+d2[x]>ans) {
ans=d1[x]+d2[x];
rec=x;
}
} int dep1[N],dep2[N];
void dfs2(int x,int dd,int fa,int *dep) {
dep[x]=dd;
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (y==fa) continue;
dfs2(y,dd+,x,dep);
}
} int main()
{
cin>>n>>m>>d;
for (int i=;i<=m;i++) {
int x; scanf("%d",&x);
v[x]=; num=x;
}
for (int i=;i<n;i++) {
int x,y; scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
} memset(d1,-0x3f,sizeof(d1));
memset(d2,-0x3f,sizeof(d2));
ans=; rec=;
dfs1(,); int cnt=;
if (m>) {
dfs2(r1[rec],,,dep1);
dfs2(r2[rec],,,dep2);
for (int i=;i<=n;i++)
if (dep1[i]<=d && dep2[i]<=d) cnt++;
} else {
dfs2(num,,,dep1);
for (int i=;i<=n;i++)
if (dep1[i]<=d) cnt++;
}
cout<<cnt<<endl;
return ;
}

CodeForces - 337D 树形dp的更多相关文章

  1. codeforces 337D 树形DP Book of Evil

    原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知 ...

  2. Codeforces 1153D 树形DP

    题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显 ...

  3. Codeforces 1088E 树形dp+思维

    比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...

  4. Codeforces 1179D 树形DP 斜率优化

    题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...

  5. CodeForces 219D 树形DP

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

  6. Up and Down the Tree CodeForces - 1065F (树形dp)

    链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$ ...

  7. codeforces 1053D 树形DP

    题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k. 问给每个叶子的值赋为几 ...

  8. Codeforces 1120D (树形DP 或 最小生成树)

    题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...

  9. Codeforces 735E 树形DP

    题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...

随机推荐

  1. 2018-8-10-win10-UWP-用Path画图

    title author date CreateTime categories win10 UWP 用Path画图 lindexi 2018-08-10 19:16:50 +0800 2018-2-1 ...

  2. setlocale - 设置当前的区域选项

    总览 (SYNOPSIS) #include <locale.h> char *setlocale(int category, const char * locale); 描述 (DESC ...

  3. Struts2学习笔记 - namespace命名空间

    默认的命名空间“ namespace="" ”. 根命名空间 “ namespace="/" ”. <package name="test&qu ...

  4. SSD算法的实现

    本文目的:介绍一个超赞的项目--用Keras来实现SSD算法. 本文目录: 0 前言 1 如何训练SSD模型 2 如何评估SSD模型 3 如何微调SSD模型 4 其他注意点 0 前言 我在学习完SSD ...

  5. 【python3】基于scrapyd + scrapydweb 的可视化部署

    一.部署组件概览 该部署方式适用于 scrapy项目.scrapy-redis的分布式爬虫项目 需要安装的组件有:     1.scrapyd  服务端 [运行打包后的爬虫代码](所有的爬虫机器都要安 ...

  6. NFA 、DFA 简述

    转载请注明出处 https://www.cnblogs.com/majianming/p/11823697.html 目前常见的正则表达引擎总体分为2种,DFA (确定型有穷状态自动机) 和 NFA ...

  7. 【leetcode】1003. Check If Word Is Valid After Substitutions

    题目如下: We are given that the string "abc" is valid. From any valid string V, we may split V ...

  8. boost scope exit

    Boost.ScopeExit provides the macro BOOST_SCOPE_EXIT, which can be used to define something that look ...

  9. UVa 839 Not so Mobile (递归思想处理树)

    Before being an ubiquous communications gadget, a mobilewas just a structure made of strings and wir ...

  10. Python基础教程(006)--Python的特点

    前言 了解Python背景,明白Python在目前社会中的标准库是有成千上万的Python爱好者共同维护的. 知识点 Python是完全面相对象的语言 函数,模块,数字,字符串都是对象,在Python ...