首页 > 其他 > 详细

[SDOI2011]消防(树的直径+二分||单调队列)

时间:2019-03-03 12:41:31      阅读:173      评论:0      收藏:0      [点我收藏+]

题目描述

某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000)。

这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的行业是消防业。由于政府对国民的热情忍无可忍(大量的消防经费开销)可是却又无可奈何(总统竞选的国民支持率),所以只能想尽方法提高消防能力。

现在这个国家的经费足以在一条边长度和不超过s的路径(两端都是城市)上建立消防枢纽,为了尽量提高枢纽的利用率,要求其他所有城市到这条路径的距离的最大值最小。

你受命监管这个项目,你当然需要知道应该把枢纽建立在什么位置上。

输入输出格式

输入格式:

 

输入包含n行:

第1行,两个正整数n和s,中间用一个空格隔开。其中n为城市的个数,s为路径长度的上界。设结点编号以此为1,2,……,n。

从第2行到第n行,每行给出3个用空格隔开的正整数,依次表示每一条边的两个端点编号和长度。例如,“2 4 7”表示连接结点2与4的边的长度为7。

 

输出格式:

 

输出包含一个非负整数,即所有城市到选择的路径的最大值,当然这个最大值必须是所有方案中最小的。

 

输入输出样例

输入样例#1: 复制
5 2
1 2 5
2 3 2
2 4 4
2 5 3
输出样例#1: 复制
5
输入样例#2: 复制
8 6
1 3 2
2 3 2 
3 4 6
4 5 3
4 6 4
4 7 2
7 8 3
输出样例#2: 复制
5

说明

【数据规模和约定】

对于20%的数据,n<=300。

对于50%的数据,n<=3000。

对于100%的数据,n<=300000,边长小等于1000。






 

最重要的一点就是路径一定全都在树的直径上,至于证明就自行百度吧嘿嘿:

 

确定直径的两个端点 l 和 r  ,维护直径上的每个点到达的最远的点的距离(不包括直径上的点),要么二分最大值,吧两个端点向里缩

 

 

 

 

 

 

 

1

[SDOI2011]消防(树的直径+二分||单调队列)

原文:https://www.cnblogs.com/zhangbuang/p/10464744.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!