树形dp-CF-337D. Book of Evil

题目链接:

http://codeforces.com/problemset/problem/337/D

题目大意:

给一棵树,m个点,一个距离d,求有多少个点A,使得A到所有的m个点距离都不超过d.

解题思路:

树形dp.

有两种方法可以解:

1、类似于树的直径的求法,先以任意一点作为树根,找到距离该点最远的m中的A点(A点一定是m个点中距离相距最远的两点的一个端点),然后以A点作为树根,依次计算各点到A点的最短距离d1[],并找到距离最远的m中的点B点,然后以B点为树根,依次找到各点到B点的距离d2[].  最后再扫一遍,找到d1和d2都不超过d的点。这种方法求比较简单。

2、先以m中任意一点为树根,在子树中,求出每个节点到达m中的点的最大距离max1,达到max1的直接儿子pre,次大距离。然后再从该根出发,递归维护一个值从父亲过来并且不是通过该节点的最大距离。每次求儿子时判断下,是不是等于该节点的pre,如果是的话,从次大中找。

树很灵活,递归很强大。多做些树上的题。

代码:

 

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
#define Maxn 110000
//
struct Node
{int max1,max2,pre; //只用保存在子树中,该点到给定点的最大距离、次大距离以及最大距离的直接儿子编号//向下推进的时候,维护一个从父亲到达该点的最大值
}node[Maxn];struct Edge
{int v;struct Edge *next;
}*head[Maxn<<1],edge[Maxn<<1]; //无向边
bool pm[Maxn];
int n,m,d,ans,cnt;void add(int a,int b)
{++cnt;edge[cnt].v=b;edge[cnt].next=head[a],head[a]=&edge[cnt];
}
void dfs1(int pre,int cur)
{if(pm[cur]) //如果是给定的点 距离为0,否则置为无穷大node[cur].max1=node[cur].max2=0;elsenode[cur].max1=node[cur].max2=-INF;struct Edge * p=head[cur];while(p){if(p->v!=pre){dfs1(cur,p->v);//先求出儿子if(node[p->v].max1+1>=node[cur].max1) //用儿子来更新最大值{node[cur].max2=node[cur].max1;//更新次大值node[cur].max1=node[p->v].max1+1;node[cur].pre=p->v;}else{  //更新次大值if(node[p->v].max1+1>node[cur].max2)node[cur].max2=node[p->v].max1+1;}}p=p->next;}
}
void dfs2(int pre,int cur,int pa) //往下递归的时候,顺便判断,决定出来
{if(max(node[cur].max1,pa)<=d) //从父亲和孩子的最大距离不超过d的话,肯定是可以的ans++;struct Edge * p=head[cur];while(p){if(p->v!=pre){if(p->v==node[cur].pre) //如果最大值是从该儿子更新过来的,从次大值中选dfs2(cur,p->v,max(node[cur].max2,pa)+1);elsedfs2(cur,p->v,max(node[cur].max1,pa)+1);}p=p->next;}
}int main()
{int a,b,aa;while(~scanf("%d%d%d",&n,&m,&d)){memset(pm,false,sizeof(pm));memset(head,NULL,sizeof(head));for(int i=1;i<=m;i++){scanf("%d",&a);pm[a]=true; //标记能够攻击的点}for(int i=1;i<n;i++){scanf("%d%d",&aa,&b);add(aa,b);add(b,aa);}ans=0;if(pm[1]) //如果是给定的m中点,从父亲过来的为0{dfs1(-1,1);dfs2(-1,1,0);}else //如果不是给定的m中的点,从父亲过来的为-INF{dfs1(-1,1);dfs2(-1,1,-INF);}// dfs1(-1,a);/* for(int i=1;i<=n;i++)printf("i:%d %d pre:%d\n",i,node[i].max1,node[i].pre);*/// dfs2(-1,a,0); //最后一个参数表示从父亲过来的最大距离,//注意不能从任意一点开始,因为从该点的父亲过来的不为0,为-INF.printf("%d\n",ans);}return 0;
}
/*
10 1 0
3
10 1
1 3
8 3
3 5
5 7
5 4
2 4
9 4
6 4
*/


 


 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运行时获取类库信息

运行时获取类库信息Intro在我们向别的开源项目提 issue 的时候&#xff0c;可能经常会遇到别人会让我们提供使用的版本信息&#xff0c;如果别的开源项目类库集成了 source link&#xff0c;我们可以从程序集信息中获取到版本以及对应的 commit 信息&#xff0c;这样我们就可以…

Oracle数据表中输入引号等特殊字符

Oracle输入特殊字符的特殊方法: UPDATE BOOKMARK SET BM_VALUEq/ --在这里写下需要输入的内容&#xff08;可以包括引号、回车等特殊的符号&#xff09;,所见即所得 / -- WHERE BM_NAMEXX

xbox360链接pc_如何将实时电视从Xbox One流式传输到Windows PC,iPhone或Android Phone

xbox360链接pcSet up your Xbox One’s TV integration and you can do more than just watch TV on your Xbox: you can also stream that live TV from your Xbox to a Windows 10 PC, Windows phone, iPhone, iPad, or Android device over your home network. 设置Xbox One…

PS2019工具介绍笔记(一)

通用快捷键 ALT鼠标滚轮放大缩小 空格按左键 移动图片 一、新建 PPI 显示器72PPI 印刷(国际通用分辨率)300PPI 海报高清写真96-200PPI 大型喷绘25-50PPI 颜色模式 RGB(红绿蓝) CMYK(青洋红黄黑)印刷业 二、移动工具 ctrlT 图形自由变换 alt…

WPF ABP框架更新日志(最新2022-11月份)

更新说明本次更新内容包含了WPF客户端以及Xamarin.Forms移动端项目, 更新内容总结如下:WPF 客户端修复启动屏幕无法跳转异常修复添加好友异常修复托盘图标状态更新异常优化好友发送消息时状态检测更新聊天窗口UI风格更新好友列表得头像显示更新聊天窗口消息日期分组显示更新系统…

JSONObject和JSONArray 以及Mybatis传入Map类型参数

import org.json.JSONArray;import org.json.JSONObject;将字符串转化为JSONArray JSONArray jsonArray new JSONArray(deviceInfo); //注意字符串的格式将JSONArray转化为JSONObject类型 JSONObject jsonObject jsonArray.getJSONObject(0);将值存入Map Map<String,S…

十月cms_微软十月更新失败使整个PC行业陷入困境

十月cmsMicrosoft still hasn’t re-released Windows 10’s October 2018 Update. Now, PC manufacturers are shipping PCs with unsupported software, and Battlefield V is coming out next week with real-time ray-tracing technology that won’t work on NVIDIA’s RT…

ab 测试工具

ab&#xff0c;即Apache Benchmark&#xff0c;在Apache的安装目录中找到它。安装目录/bin/ab.exe。ab -n 数字 -c 数字 url路径我们对位于本地Apache服务器上、URL为localhost/index.php的页面进行压力测试。测试总次数为1000&#xff0c;并发数为100(相当于100个用户同时访问…

bat批处理笔记(二)

eof 是“end of file”的缩写 在批处理作用主要有二&#xff1a; 1、在无call的情况下&#xff0c;会直接退出批处理&#xff0c;此时等同于exit 2、在call的情况下&#xff0c;会中止call&#xff0c;继续执行其他命令 echo off call :str1 pause goto :eof echo //此行代…

让Visual Studio 2013为你自动生成XML反序列化的类

Visual Sutdio 2013增加了许多新功能&#xff0c;其中很多都直接提高了对代码编辑的便利性。如&#xff1a; 1. 在代码编辑界面的右侧滚动条上显示不同颜色的标签&#xff0c;让开发人员可以对所编辑文档的修改、查找、定位情况一目了然。而不用像往常一样上下不停地拖动滚动条…

20年的 .NET ,更需要 00 后的你

.NET 20 周年&#xff0c; 在国内有一大批和 .NET 一起成长的开发者&#xff0c;有一大批在不同行业采用 .NET 作为解决方案的企业。或者你会经常听到很多的大神说他的 .NET 经历&#xff0c;也会听到 .NET “牛逼” 的故事&#xff0c;更会听到用 .NET 不用“996”的神话。但对…

UIT创新科存储系统服务“500强”汽车名企

信息化已成为汽车产业链各企业提高市场竞争力和传统汽车产业谋求转型升级的推动力&#xff0c;无论是汽车生产商&#xff0c;还是汽车服务商和零配件生产商&#xff0c;无不重视信息化系统的建设。某全球汽车行业著名的零配件生产商&#xff0c;财富500强企业之一&#xff0c;从…

通过从备份中排除这些文件夹来节省Time Machine驱动器上的空间

Are you getting notifications about a full Time Machine drive? Do you feel like your backups are taking too long? A bigger, faster hard drive might be the best solution, but you can also help by excluding particular folders from your backups. 您是否收到有…

c#调用触滑输入法实现触摸屏键盘功能

背景最近在做一个项目&#xff0c;用户端是触摸屏&#xff0c;涉及到一些表单数据的操作&#xff0c;因为是没有外接的鼠标键盘&#xff0c;所以想着当用户在操作表单的时候&#xff0c;能够把软件键盘输入法给调出来使用。什么是触滑输入法触滑输入法Swype&#xff0c;是针对触…

Teradata天睿公司推出适用各种部署环境的全球最强分析数据库

Teradata天睿公司&#xff08;Teradata Corporation&#xff0c;纽交所&#xff1a;TDC&#xff09;推出Teradata Everywhere™&#xff0c;成为业内首家在多种公有云、托管云和本地部署环境下部署全球最强海量并行处理&#xff08;MPP&#xff09;分析数据库的厂商。这些部署环…

[转载]C/C++框架和库

C/C框架和库 装载自:http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419值得学习的C语言开源项目 Webbench Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL&#xff0c;测试网站在压力下工作的性能&#…

如何使用智能铃声避免在Android中令人尴尬的大声铃声

Choosing a ringtone volume can be hard – there is no one setting that is right for all environments. What works perfectly at home may be too quiet for when you’re on the train, but too loud for the office. Intelligent Ringer can be used to adjust ringto…

为什么要把类设置成密封?

前几天笔者提交了关于FasterKvCache的性能优化代码&#xff0c;其中有一个点就是我把一些后续不需要继承的类设置为了sealed密封类&#xff0c;然后就有小伙伴在问&#xff0c;为啥这个地方需要设置成sealed&#xff1f;提交的代码如下所示&#xff1a;一般业务开发的同学可能接…

powershell 常用命令笔记

常用集合&#xff0c;方便后续复制粘贴 # 判断文件在不在 # 输出文件 IF(!(test-path $filePath)) {$result|Out-File $filePath }# 读取txt $result(Get-Content $filePath -TotalCount 1).Trim() $result# 删除文件 remove-item "C:\wistron\Datasource\spiderPort.txt…

Linux 性能监控 : CPU 、Memory 、 IO 、Network

一、CPU 1.良好状态指标 CPU利用率&#xff1a;User Time < 70%&#xff0c;System Time < 35%&#xff0c;User Time System Time < 70% 上下文切换&#xff1a;与CPU利用率相关联&#xff0c;如果CPU利用率状态良好&#xff0c;大量的上下文切换也是可以接受的 可…