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]== ...
 
随机推荐
- tableview随笔
			
//获得row NSInteger row = [[self.treeTableViewindexPathForCell:(UITableViewCell *)[[[notification.user ...
 - C/C++对Lu系统内置动态对象进行运算符重载
			
欢迎访问Lu程序设计 C/C++对Lu系统内置动态对象进行运算符重载 1 说明 要演示本文的例子,你必须下载Lu32脚本系统.本文的例子需要lu32.dll.lu32.lib.C格式的头文件lu32. ...
 - android基础组件---->Checkboxe的使用
			
由于使用比较简单,这篇博客涵盖Checkboxes和Radio Buttons和Toggle Buttons.好了我们开始今天的学习.我被世俗隐瞒,转身又被自己撞倒.从莫须有的罪名起步,行色简单,心术 ...
 - 安装php环境xampp
			
1.下载xampp 安装 2.如果启动时发生端口占用错误, 是443和80端口被占用, 可以改成444,88端口, 在C:\xampp\apache\conf\extra\httpd-ssl.conf ...
 - 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
			
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
 - [USB] Windows USB/DVD Download Tool
			
此工具为微软官方U盘启动盘制作工具 Windows USB/DVD Download Tool 说明:https://www.microsoft.com/en-us/download/windows- ...
 - windows本地环境如何用wamp配置多域名绑定访问
			
https://jingyan.baidu.com/article/acf728fd5fcdadf8e510a3e5.html
 - 求树的直径和中心(ZOJ3820)
			
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5374 Building Fire Stations Time Limit: 5 ...
 - 三维凸包求重心到面的最短距离(HDU4273)
			
http://acm.hdu.edu.cn/showproblem.php?pid=4273 Rescue Time Limit: 2000/1000 MS (Java/Others) Memo ...
 - zabbix 部署 jmx 监控tomcat
			
zabbix提供了一个java gateway的应用去监控jmx(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架.JMX可以 ...