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 ...
随机推荐
- centos7 firefox 安装flash
在官网下载flash的tar包 https://get.adobe.com/flashplayer/?spm=a2h0j.8191423.movie_player.5~5~5~8~A 在下载tar包的 ...
- Ubuntu 16.04 关闭/打开笔记本触摸板
由于笔记本触摸板太多灵敏,影响使用,所以禁用掉触摸板. 禁用触摸板命令: sudo rmmod psmouse 启用触摸板命令 sudo modprobe psmouse 注意:启用之后可能会有几秒钟 ...
- 如何简单的实现一个tab页title的动画效果
首先我们来看看实现的效果 tab上的title沉下去的效果 先来看看布局 <?xml version="1.0" encoding="utf-8"?> ...
- HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)
HDU 5045 5047 5050 5053 太菜了,名额差点没保住.吓尿..赶紧开刷树链抛分 5045:状压DP.压缩10个人.因为两个人不能差2以上,所以能够用01表示 5047:推推公式就可以 ...
- JQuery基础知识--方便忘记时查看
第一次写博客,不多说废话,实用为先.如有不对,请多指正. JQuery api 第一步引入JQuery库. <script type="text/javascript" sr ...
- python pymysql安装
==================pymysql=================== 由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 ...
- 【BZOJ2728】[HNOI2012]与非 并查集+数位DP
[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. ...
- java 基于tomcat的数据源案例
1.在context中定义数据源 <?xml version="1.0" encoding="UTF-8"?> <Context path=& ...
- linux服务器最大连接数
1 受内存限制 每个tcp连接是一个打开的socket文件,因此linux服务器的最大连接数受linux操作系统单个进程同时打开的最大文件数的限制. 这个限制本质上是对单个进程内存的限制. 查看进程最 ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...