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点 ...
随机推荐
- 【原创】微信最新表情js代码
最近在做仿微信聊天表情发送功能,所以需要展示常用的105个表情. 因为对接微信公众号的时候,用户聊天过程中发送的表情,微信服务器会转成对应的代码传给我们的服务器,类似如下: :/::)/::~/::B ...
- showmount - 显示关于 NFS 服务器文件系统挂载的信息
总览 /usr/sbin/showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] ...
- python使用logging模块实现日志写入
python实现的logging写入日志的功能.logging模块还是挺好用的 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018 ...
- mybatis-generator 代码自动生成插件
Hibernate 可以选择MyEclipse Datebase Explorer 或者是 Hibernate-tools 等工具来自动生成映射文件和实体类. mybatis 当然也要有!下面简单介绍 ...
- vue.config.js配置前端代理
// vue.config.js 配置说明 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions // 这 ...
- JavaScript 获取时间,时间戳
一. 动态获取js时间 1.方法一:最简单的写法,直接输出时间到页面 <!DOCTYPE html> <html> <head> <title>< ...
- css代码思考:display和float
关于display <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- PHP 3DES 加解密(CBC模式,pkcs5padding填充)
1.前言:项目中接入第三方支付遇到3DES加密,以前也没用过,搜了好多,都不适用,各种不对,后来自己结合搜到的终于弄正确了,检测地址:http://tool.chacuo.net/crypt3des. ...
- Apache的虚拟主机功能(基于IP、域名、端口号)
Apache虚拟主机就是在一个Apache服务器上配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录. 主要有三种方法: 1.通过不同的IP地址 2.通过不同的域名 ...
- jmeter 5 参数化
文件: 文件编码 注意: 如果文件另存为utf-8,文件第一行头会带bom头(不可见字符),jmeter读取参数后,会把头读取到请求报文中,提示不存在该用户 什么是bom头? 在utf-8编码文件中B ...