Codeforces 337D Book of Evil:树的直径【结论】
题目链接:http://codeforces.com/problemset/problem/337/D
题意:
给你一棵树,n个节点。
如果一个节点处放着“罪恶之书”,那么它会影响周围距离不超过d的所有节点。
然后告诉你一部分被影响的节点aff[i],共m个。
已知有且仅有一个节点放着“罪恶之书”。
现在问你有多少个节点可能放着“罪恶之书”。
题解:
如果一个节点放着“罪恶之书”,那么它到所有aff[i]的距离都不超过d。
也就是:max(它到aff[i]的距离) <= d
有一个关于树的直径的结论:
从一个点出发,不重复经过节点,若要使走的路程最远,则最终到达的点一定是树的直径的某个端点。
在这道题中就是:
从一个点出发,若到达aff[i]的距离在所有受影响的节点中最大。
则节点i一定是受影响的点中,两两距离最远的一对点(op,ed)中的一个。
所以要找出在aff[i]中,两两距离最远的一对点(op,ed)。
也就是求所有aff[i]构成的一棵树的直径:
先随便找一个aff[i],从它开始dfs1一遍,找出最远的点即为op。
再从op开始,dfs1一遍,找出ed。
然后从op和ed分别做一次dfs2,给每个距离不超过d的点的cnt加1。
最后统计一下cnt为2的点的个数,即为答案。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 100005 using namespace std; int n,m,d;
int maxd;
int op,ed;
int aff[MAX_N];
int cnt[MAX_N];
bool flag[MAX_N];
vector<int> edge[MAX_N]; void read()
{
cin>>n>>m>>d;
memset(flag,false,sizeof(flag));
for(int i=;i<=m;i++)
{
cin>>aff[i];
flag[aff[i]]=true;
}
int x,y;
for(int i=;i<n;i++)
{
cin>>x>>y;
edge[x].push_back(y);
edge[y].push_back(x);
}
} void dfs1(int now,int p,int nd,int &v)
{
if(nd>maxd && flag[now])
{
maxd=nd;
v=now;
}
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(temp!=p)
{
dfs1(temp,now,nd+,v);
}
}
} void dfs2(int now,int p,int stp)
{
if(stp>d) return;
cnt[now]++;
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(temp!=p) dfs2(temp,now,stp+);
}
} void work()
{
maxd=-;
dfs1(aff[],-,,op);
maxd=-;
dfs1(op,-,,ed);
memset(cnt,,sizeof(cnt));
dfs2(op,-,);
dfs2(ed,-,);
int ans=;
for(int i=;i<=n;i++)
{
if(cnt[i]==) ans++;
}
cout<<ans<<endl;
} int main()
{
read();
work();
}
Codeforces 337D Book of Evil:树的直径【结论】的更多相关文章
- codeforces 14D(搜索+求树的直径模板)
D. Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input o ...
- codeforces 337D Book of Evil (树形dp)
题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...
- codeforces 337D Book of Evil(dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Book of Evil Paladin Manao caught the tra ...
- Codeforces 379F New Year Tree 树的直径的性质推理
New Year Tree 我们假设当前的直径两端为A, B, 那么现在加入v的两个儿子x, y. 求直径的话我们可以第一次dfs找到最远点这个点必定为直径上的点, 然而用这个点第二次dfs找到最远点 ...
- Codeforces 337D Book of evil
一道树形dp,写出来是因为最近也做了道类似的.这题是看了分析的思路才做出来的,但感觉很多这样的dp都是利用类似的性质.像这题的话distDown很好想,但distUp的时候就很难想了,其实只要抓住di ...
- codeforces 337D 树形DP Book of Evil
原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知 ...
- codeforce 337D Book of Evil ----树形DP&bfs&树的直径
比较经典的老题 题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d. 这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来 ...
- codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径
题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...
- codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点
J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...
随机推荐
- pip或者anacnda安装opencv以及opencv-contrib
一条命令就可以搞定: pip install opencv-contrib-python opencv-python 或者: pip install opencv-contrib-python== ...
- 第八章 委托,lamdbda 表达式和事件
第八章 委托,lamdbda 表达式和事件 委托是寻址方式的.net版本. 委托是类型安全的类,它定义了返回类型和参数的类型.委托类不仅包含方法的应用,也可以包含对多个方法的引用. 在 C++中,函数 ...
- 启动spring boot 异常
再我搭建spring boot工程后,run application的时候抛出下面异常 Exception /slf4j-log4j12-.jar). If you are using WebLogi ...
- 产生n个数全排列的算法
给定n个数{1...n},如何给出这n个数的全排列呢? 给定一个整数k,我们给它一个向左或向右的方向,k(->)或者k(<-),我们说k是可以移动的,如果它的方向指向一个相邻的比它小的数, ...
- 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】
此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...
- JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期
JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期. JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成ser ...
- html5小趣味知识点系列(一)pubdate
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- html5小趣味知识点系列(二)tabindex
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux下安装 activemq 并指定jdk 1.8
1. 下载安装包 <apache-activemq-5.15.4-bin.tar.gz> 下载地址:https://pan.baidu.com/s/18xzjBAchjWqsHNA1HuY ...
- xlrd python excel
xlrd python excel