bzoj1999 / P1099 树网的核
(bzoj数据加强)
前置知识:树的直径
(并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE)
正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再dfs,再全图找一遍。
分类讨论:
1.偏心距可能是所取路径上(非端点)的某一点与直径外一点的距离
解决方案:在该点上跑一遍dfs,不能通过树的直径,找到距离最远的点。
2.偏心距可能是所取路径的端点与直径端点之间未取部分的长度。
所取路径的端点在直径上,根据性质,与它相对距离最远的点十分显然是直径的端点。
解决方案:在直径上用尺取法找一遍
end.
#include<iostream>
#include<cstdio>
#include<cstring>
#define rint register int
using namespace std;
void read(int &x){
char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 500002
int n,s,k,ans=1e9,fa[N],mark[N],d[N];
int cnt,hd[N],nxt[N<<],ed[N],poi[N<<],val[N<<];
inline void adde(int x,int y,int v){
nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
ed[x]=cnt, poi[cnt]=y, val[cnt]=v;
}
void dfs(int x,int ffa){
fa[x]=ffa;
if(d[x]>d[k]) k=x; //更新距离最远的点
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==ffa||mark[to]) continue;
d[to]=d[x]+val[i];
dfs(to,x);
}
}
int main(){
read(n); read(s); int q1,q2,q3;
for(rint i=;i<n;++i){
read(q1); read(q2); read(q3);
adde(q1,q2,q3),adde(q2,q1,q3);
}k=; dfs(,); d[k]=; dfs(k,);//常规方法求树的直径
for(rint i=k,j=k;i;i=fa[i]){
while(d[j]-d[i]>s) j=fa[j];
ans=min(ans,max(d[k]-d[j],d[i]));
}//在直径上用尺取法找偏心距
for(rint i=k;i;i=fa[i]) mark[i]=;
for(rint i=k;i;i=fa[i]) d[i]=,dfs(i,fa[i]);//dfs找路径上某点与非直径的某点的偏心距
for(rint i=;i<=n;++i) ans=max(ans,d[i]);//全图找一遍
printf("%d",ans);
return ;
}
bzoj1999 / P1099 树网的核的更多相关文章
- 洛谷 P1099 树网的核
P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...
- P1099 树网的核——模拟+树形结构
P1099 树网的核 无根树,在直径上找到一条长度不超过s的路径,使得最远的点距离这条路径的距离最短: 首先两遍dfs找到直径(第二次找的时候一定要吧father[]清零) 在找到的直径下枚举长度不超 ...
- P2491 消防/P1099 树网的核
P2491 消防/P1099 树网的核 双倍经验,双倍快乐. 题意 在一个树上选择一段总长度不超过\(s\)的链使所有点到该链距离的最大值最小. 输出这个最小的值. 做法 Define:以下\(s\) ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- 【BZOJ1999】树网的核
题目大意:题目过长,无法简单描述... 题解: 由于树网的核一定是树直径的一段,因此考虑先将直径取出,通过两次 BFS 即可.要求的东西是树上任意一点到这条取出的线段的距离的最大值,发现这个最大值有可 ...
- P1099 树网的核 && P2491 [SDOI2011]消防
给定一棵树, 你可以在树的直径上确定一条长度不超过 \(S\) 的链, 使得树上离此链最长的点距离最小, 输出这个距离 P2491 数据范围为 P1099 的 \(1000\) 倍 Solution ...
- #P1099 树网的核 题解
题目描述 pdf 题解 这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵. 已经给出来这是个DAG,所以不用担心连通性的问题.那么怎么做呢? 朴素的做法是把树的直径的两个端点都统计出来 ...
- P1099 树网的核
NOIP 2007 提高第四题. 啊......我还是看了题解才做出来的. 这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊! 然后,这破题怎么暴力?感觉我的 ...
- 洛谷P1099 树网的核
传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...
随机推荐
- IntersectRect、wcsrchr、CComPtr、GetFileAttributes
IntersectRect 两矩形相交形成的新矩形 The IntersectRect function calculates the intersection of two source re ...
- c++11——type_traits 类型萃取
一. c++ traits traits是c++模板编程中使用的一种技术,主要功能: 把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用tr ...
- hibernate在Oracle中插入数据,默认字段被设置为null的问题解决
参考内容: http://blog.sina.cn/dpool/blog/s/blog_90629d5301014a5w.html 在数据库中一个字段的默认值为1,但是在插入数据后,本来该字段为空,值 ...
- 百度移动开发平台在用angularJS
- eclipse/myeclipse 中的一些常用的快捷键
一.eclipse 中的一些常用的快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率. Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] ...
- ajax初级知识(转载)
1.什么是ajax? Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应 ...
- 03.JMS深入
1.JMS API JMS API可以分为3个主要部分:公共API.点对点API和发布/订阅API.在JMS1.1中,公共API可被用于向一个队列或主题发送消息,或从其中接收消息.点对点API ...
- 关于typecho,404页面错误
之前用typecho,但是没发现404错误页面; 现在只要发布文章就提示404页面错误. 解决方法 点击发布日期,将发布日期的分向后拖动几分钟: 然后发布,发现404错误不见了: 我是遇到这种情况了不 ...
- Jenkins可持续集成
Jenkins 平台安装部署 基于Java开发的持续集成工具,需要安装Java JDK软件 (1).Jenkins稳定版下载地址:wget http://updates.jenkins-ci.org ...
- 奇怪的Visual Studio 2013停止响应问题
昨天开始遭遇这个问题,今天再次遭遇. 疑似问题发生在写代码的窗口中复制/粘贴时(有待进一步确认触发条件),突然停止响应,出现下面的对话框: 对话框中的文字为: Waiting for a requir ...