CodeForces - 337D 树形dp
题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于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的更多相关文章
- codeforces 337D 树形DP Book of Evil
		
原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知 ...
 - Codeforces 1153D 树形DP
		
题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显 ...
 - Codeforces 1088E 树形dp+思维
		
比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...
 - Codeforces 1179D 树形DP 斜率优化
		
题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...
 - CodeForces 219D 树形DP
		
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...
 - Up and Down the Tree CodeForces - 1065F (树形dp)
		
链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$ ...
 - codeforces 1053D 树形DP
		
题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k. 问给每个叶子的值赋为几 ...
 - Codeforces 1120D (树形DP 或 最小生成树)
		
题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...
 - Codeforces 735E 树形DP
		
题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...
 
随机推荐
- CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 2018.3.11
			
CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 阿里云服务器的选择 当然是选择学生优惠啦.这里阿里云还提供了轻量级服务器这个选项,可以预装 LA ...
 - 2019-10-31-WPF-等距布局
			
title author date CreateTime categories WPF 等距布局 lindexi 2019-10-31 9:0:2 +0800 2018-2-21 17:3:4 +08 ...
 - 常看 Shell: 文本文件操作
			
文件显示和信息 wc wc 可以用于统计文件的行数和单词数. nl nl 在文件的每行内容前面加上行号. 基于行的操作 grep grep 用于筛选匹配特定字符的行. grep "Hello ...
 - Codeforces 1188D Make Equal DP
			
题意:给你个序列,你可以给某个数加上2的幂次,问最少多少次可以让所有的数相等. 思路(官方题解):我们先给序列排序,假设bit(c)为c的二进制数中1的个数,假设所有的数最后都成为了x, 显然x &g ...
 - rabbitmq一个连接多个信道channel
			
https://www.cnblogs.com/eleven24/p/10326718.html
 - 在Tomcat中配置404自定义错误页面详解
			
这篇文章主要介绍了在Tomcat中配置404自定义错误页面全解,需要的朋友可以参考下 一直使用tomcat,今天想到一个问题,自定义404错误页面, 为了获得很好的用户感受,是不应当向用户暴露404这 ...
 - GCC -l选项:手动添加链接库
			
链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件.在链接过程中,它必须把符号(变量名.函数名等一些列标识符)用对应的数据的内存地址(变量地址.函数地址等)替代,以完成程 ...
 - OpenCV常用基本处理函数(4)简单变换,阈值等
			
几何变换 缩放 img=cv2.imread('messi5.jpg') # 下面的 None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子 # 因此这里为 None res=cv2.res ...
 - JAXB中的@XmlRootElement注解详解
			
@Retention(value=RUNTIME) @Target(value=TYPE) public @interface XmlRootElement @Inherited @Retention ...
 - 【leetcode】994. Rotting Oranges
			
题目如下: In a given grid, each cell can have one of three values: the value 0 representing an empty cel ...