比较经典的老题

题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d。

这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来遍历一遍树,存下所有点到点1的距离。然后在m个特殊点中找到距离点1最远的点a1.

然后以a1为初始点遍历一遍树,求每一个点到a1的距离,存在dp[i]中。并且再在m个点中找到到a1距离最大的点a2.最后再以a2为初始点遍历一遍树,求到每一个点到a2的距离dp1[i]。然后for遍历所有点,如果dp[i]和dp1[i]都不大于d,那么合法解+1;

这里可以做一个小证明,如果一个点k还能在m个特殊点中找到距离大于到a1和到a2距离的点s的话,那么点k到a1的距离加上点k到s的距离将大于k到a1加上k到a2,那么在第二次搜索中搜到的距离a1最远的点就不应该是a2而是s,所以不成立。由此反证得知。

具体代码如下:

#include<iostream>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
bool pd[];
int dp[],dp1[];
int dd[];
vector<int> a[];
int bfs(int u)
{
memset(pd,false,sizeof(pd));
memset(dp,,sizeof(dp));
pd[u]=;
queue<int> q;
q.push(u);
while(q.size()!=)
{
int t=q.front();
q.pop();
for(int i=;i<a[t].size();i++)
{
int v=a[t][i];
if(pd[v]) continue;
//cout<<"w="<<w<<endl; pd[v]=;
dp[v]=dp[t]+;
q.push(v);
}
}
return ;
}
int bfs1(int u)
{
memset(pd,false,sizeof(pd));
memset(dp1,,sizeof(dp1));
pd[u]=;
queue<int> q;
q.push(u);
while(q.size()!=)
{
int t=q.front();
q.pop();
for(int i=;i<a[t].size();i++)
{
int v=a[t][i];
if(pd[v]) continue;
//cout<<"w="<<w<<endl; pd[v]=;
dp1[v]=dp1[t]+;
q.push(v);
}
}
return ;
}
int main()
{
int i,j,k,l,x,y,n,m,d;
scanf("%d%d%d",&n,&m,&d);
// cout<<n<<" "<<m<<" "<<d<<endl;
for(i=;i<m;i++) scanf("%d",&dd[i]);
for(i=;i<n-;i++)
{
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
}
bfs();
int lon=,a1=;
for(i=;i<m;i++)
if(dp[dd[i]]>lon)
{
lon=dp[dd[i]];
a1=dd[i];
}
//cout<<lon<<"。。"<<a1<<endl;
bfs(a1);
lon=;
for(i=;i<m;i++)
if(dp[dd[i]]>lon)
{
lon=dp[dd[i]];
a1=dd[i];
}
//cout<<lon<<"。。"<<a1<<endl;
int ans=;
bfs1(a1);
for(i=;i<=n;i++)
{
if(dp[i]<=d&&dp1[i]<=d) ans++;
}
//for(i=1;i<=n;i++) cout<<dp[i]<<" "<<dp1[i]<<endl;
printf("%d\n",ans);
}

codeforce 337D Book of Evil ----树形DP&bfs&树的直径的更多相关文章

  1. 浅谈关于树形dp求树的直径问题

    在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...

  2. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  3. 树形DP 学习笔记(树形DP、树的直径、树的重心)

    前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...

  4. CF 337D Book of Evil 树形DP 好题

    Paladin Manao caught the trail of the ancient Book of Evil in a swampy area. This area contains n se ...

  5. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

  6. hdoj2196(树形dp,树的直径)

    题目链接:https://vjudge.net/problem/HDU-2196 题意:给出一棵树,求每个结点可以到达的最远距离. 思路: 如果求得是树上最长距离,两次bfs就行.但这里求的是所有点的 ...

  7. hdu2196 树形dp经典|树的直径

    /* 两种做法 1.求出树直径v1,v2,那么有一个性质:任取一点u,树上到u距离最远的点必定是v1或v2 那么可以一次dfs求树v1 第二次求dis1[],求出所有点到v1的距离,同时求出v2 第三 ...

  8. POJ 1985 Cow Marathon (树形DP,树的直径)

    题意:给定一棵树,然后让你找出它的直径,也就是两点中的最远距离. 析:很明显这是一个树上DP,应该有三种方式,分别是两次DFS,两次BFS,和一次DFS,我只写了后两种. 代码如下: 两次BFS: # ...

  9. 树形dp - 求树的直径

    随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...

随机推荐

  1. oracle学习笔记第二天

    一.连接查询 --笛卡尔积(表 * 表),连接的基础select * from emp,dept;--等值连接select * from emp e,dept d where e.deptno = d ...

  2. 匹配字符串中的s开头的单词,并替换

    String s="now it's sping,but today is so cold!"; String a=s.replaceAll("s\\w+",& ...

  3. CF1139D Steps to One

    题目链接:洛谷 这个公式可真是个好东西.(哪位大佬知道它叫什么名字的?) 如果$X$恒$\geq 0$,那么 $$E[X]=\int_0^{+\infty}P(X>t)dt$$ 呸,我什么都没写 ...

  4. 转载:Android RecyclerView 使用完全解析 体验艺术般的控件

    转自:https://blog.csdn.net/lmj623565791/article/details/45059587

  5. 快递单号自动识别接口API-trackingmore

    一.快递单号自动识别接口功能说明 (1)PC电脑端.移动APP或者自建网站集成物流查询功能时,只需要用户输入单号即可,不需要输入快递公司. (2)此接口可以配合Trackingmore的快递查询API ...

  6. C#博客目录

    基础加强 1.索引器 2.密闭类.静态类及扩展方法 3.值.引用类型及结构体 4.秒懂IL.CTS.CLS和CLR 5.装箱与拆箱 6.引用相等与运算符重载 7.ref与out 8.委托和事件 9.对 ...

  7. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  8. 【LeetCode每天一题】Plus One(加一)

    Given a non-empty array of digits representing a non-negative integer, plus one to the integer.The d ...

  9. How to use draggable attribute?怎样使用拖拽属性代码分享

    6.7 Drag and dropSupport: dragndropChrome for Android NoneChrome 4+iOS Safari 11.0+UC Browser for An ...

  10. 007-li标签CSS水平居中垂直居中

    水平居中是text-align:center垂直居中 一般是用 line-height比如你li的高度是80px 那你设置 line-height:80px 文字就垂直居中