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 ...
随机推荐
- ubuntu16.04 opencv3.4.1 opencv-contribute3.4.1 compile
sudo apt install cmake cmake-gui vim git wget -y sudo apt-get install ibus-pinyin sudo apt-get insta ...
- HTML5 2D平台游戏开发#7Camera
在庞大的游戏世界中,玩家不能一览地图全貌,而是只能看到其中一部分,并一步步探索,这时就要用到一种技术来显示局部的地图,游戏术语称为摄像机(Camera).下面两张图中的白色矩形框表示了Camera的作 ...
- bootstrap-ui-datetime-picker插件学习
GitHub:https://github.com/Gillardo/bootstrap-ui-datetime-picker 准备 安装:bower install --save bootstrap ...
- Http调试工具-Fiddler使用指引
转自:http://my.oschina.net/u/1388024/blog/186886#OSC_h1_9 目录[-] Fiddler是什么? Fiddler能做什么? 从哪里下载? 安装: 初次 ...
- iOS swift 给MBProgressHUD添加分类
MBProgressHUD在开发中经常会用到,今天把MBProgressHUD的方法拓展了一下,更加方便使用 1.可以实现gif图片的展示,使用时请替换test.gif 2.可以控制是否允许交互,如果 ...
- warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'.
'matching'参数是 git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支. 而 Git 2.x 默认的是 ...
- Problem A. Dynamic Grid
Problem We have a grid with R rows and C columns in which every entry is either 0 or 1. We are going ...
- Unable to resolve address ' ' service ' ': Name or service not known
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免.欢迎指正. 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- linux下tomcat6无法显示图片验证码 少了图形插件
linux下tomcat6无法显示图片验证码(windows下显示正常) 原创 2015年10月20日 10:31:47 3526 linux下tomcat6无法显示图片验证码(windows下显示正 ...
- python操作Excel读写--使用xlrd (转)
(转自:http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html) 一.安装xlrd模块 到python官网下载http://pypi ...