比较经典的老题

题目意思:给你一颗节点数为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. python利用requests库模拟post请求时json的使用

    我们都见识过requests库在静态网页的爬取上展现的威力,我们日常见得最多的为get和post请求,他们最大的区别在于安全性上: 1.GET是通过URL方式请求,可以直接看到,明文传输. 2.POS ...

  2. 记AOP概念理解

    OOD/OOP面向名词领域,AOP面向动词领域. 应用举例 假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类 ...

  3. JavaWeb初级进阶高级学习方向计划

    阶段1 语言基础 课程一.Java负基础扫盲课 1.初识Java 本课程从java开发环境配置开始,讲解了java语法基础 .类和面向对象.面向对象编程三大特性:封装.继承.多态.建议零基础学员从本课 ...

  4. Linux----------开始使用Screen

    1.直接在命令行键入screen命令 screen   然后回车就可以创建一个全新的回话窗口 2.screen -ls 查看开启的会话窗口 3.重新连接会话  screen -r  1231    数 ...

  5. #WEB安全基础 : HTTP协议 | 文章索引

    本系列讲解WEB安全所需要的HTTP协议 #WEB安全基础 : HTTP协议 | 0x0 TCP/IP四层结构 #WEB安全基础 : HTTP协议 | 0x1 TCP/IP通信 #WEB安全基础 : ...

  6. IDE中使用System.getProperty()获取一些属性

    使用环境:一般在项目首页或者项目后端配置中会使用到一些属性获取: package com.liuyc.study.utils; /** * 获取当前操作系统中或者当前环境中的一些默认配置 * @aut ...

  7. Fastcgi、CGI 是什么

    1.CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. 2.web server(比如说nginx)只是内容的分发者. 比如,如果请求/index ...

  8. t-SNE完整笔记

    http://www.datakit.cn/blog/2017/02/05/t_sne_full.html t-SNE(t-distributed stochastic neighbor embedd ...

  9. spring boot + vue + element-ui全栈开发入门——前端编辑数据对话框

     需求 1.点击“添加”按钮,弹出录入数据的对话框窗口,并录入数据,如果数据有误则不允许提交.数据填写完毕后,点击“保存”按钮,调用http协议提交数据,提交完毕刷新页面数据.点击“取消”按钮关闭对话 ...

  10. 教你如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...