Description

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

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

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

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

Input

输入包含n行:
    第1行,两个正整数n和s,中间用一个空格隔开。其中n为城市的个数,s为路径长度的上界。设结点编号以此为1,2,……,n。
  从第2行到第n行,每行给出3个用空格隔开的正整数,依次表示每一条边的两个端点编号和长度。例如,“2 4 7”表示连接结点2与4的边的长度为7。

Output

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

Sample Input

【样例输入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

Sample Output

 

HINT

【数据规模和约定】

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

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

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

【思路】

树的直径,二分法

可以知道题目要找的路径一定是树的直径的一段。对于这段在树上的路径,到达它的最大值有两种情况:一种是到达路径端点,这时候最大值为树的直径的两端取较大;另一种是和路径上除端点外的节点相连。

求出其他节点到直径的最大值mx,则答案一定不小于该最大值,并以之为下界二分直径端点到路径端点的距离,取最小。

【代码】

  1. #include<queue>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  8. using namespace std;
  9.  
  10. const int N = *1e5+;
  11. const int INF = 1e9;
  12.  
  13. struct Edge{ int v,w; };
  14. vector<Edge> g[N];
  15. int n,S,que[N],qz,dis[N],mark[N],fa[N];
  16.  
  17. void read(int& x) {
  18. char c=getchar(); int f=; x=;
  19. while(!isdigit(c)) {if(c=='-')f=-; c=getchar();}
  20. while(isdigit(c)) x=x*+c-'',c=getchar();
  21. x*=f;
  22. }
  23.  
  24. queue<int> q;
  25. void bfs(int u) {
  26. q.push(u); fa[u]=-;
  27. FOR(i,,n) dis[i]=INF; dis[u]=;
  28. while(!q.empty()) {
  29. int u=q.front(); q.pop();
  30. for(int i=;i<g[u].size();i++) {
  31. int v=g[u][i].v;
  32. if(v!=fa[u]) {
  33. fa[v]=u; q.push(v);
  34. if(mark[v]) dis[v]=dis[u];
  35. else dis[v]=min(dis[v],dis[u]+g[u][i].w);
  36. }
  37. }
  38. }
  39. }
  40. bool can(int ML) {
  41. int l=,r=qz;
  42. while(l<=qz && que[]-que[l+]<=ML) l++;
  43. while(r && que[r-]-que[qz]<=ML) r--;
  44. return que[l]-que[r]<=S;
  45. }
  46.  
  47. int main() {
  48. read(n),read(S);
  49. int u,v,w,x=,y=,dist,L=,R=,M;
  50. FOR(i,,n-) {
  51. read(u),read(v),read(w);
  52. g[u].push_back((Edge){v,w});
  53. g[v].push_back((Edge){u,w});
  54. }
  55. bfs(); FOR(i,,n) if(dis[i]>dis[x]) x=i;
  56. bfs(x); FOR(i,,n) if(dis[i]>dis[y]) y=i;
  57. int t=y; R=dis[y]-dis[x];
  58. while(t!=x) {
  59. que[++qz]=dis[t]; mark[t]=;
  60. t=fa[t];
  61. }
  62. que[++qz]=dis[t];
  63. bfs(x);
  64. FOR(i,,n) L=max(L,dis[i]);
  65. while(L<R) {
  66. M=(L+R)>>;
  67. if(can(M)) R=M; else L=M+;
  68. }
  69. printf("%d",L);
  70. return ;
  71. }

bzoj 2282 [Sdoi2011]消防(树的直径,二分)的更多相关文章

  1. Bzoj 2282: [Sdoi2011]消防(二分答案)

    2282: [Sdoi2011]消防 Time Limit: 10 Sec Memory Limit: 512 MB Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条 ...

  2. bzoj 2282: [Sdoi2011]消防

    #include<cstdio> #include<cstring> #include<iostream> #define N 600000 using names ...

  3. [SDOI2011] 消防 (树的直径,尺取法)

    题目链接 Solution 同 \(NOIP2007\) 树网的核 . 令 \(dist_u\) 为以 \(u\) 为根节点的子树中与 \(u\) 的最大距离. \(~~~~dis_u\) 为 \(u ...

  4. 【SDOI2011 第2轮 DAY1】消防 -[树的直径+树链剖分][解题报告]

    [SDOI2011 第2轮 DAY1]消防 题面: SDOI2011 第2轮 DAY1]消防 时间限制 : 20000 MS 空间限制 : 565536 KB 问题描述 时限\(2s\) 某个国家有\ ...

  5. Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)

    题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...

  6. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  7. zoj3820 树的直径+二分

    这题是个遗憾 !!!!!当时一直不敢相信两个站一定在直径上,赛后想想自己真的是脑袋抽风, 如果其中一个站不在直径上就反向的说明了这条不是直径.可以很明白我们可以肯定的是有一个点一定在直径上假如另外一个 ...

  8. NOIP 2015 BZOJ 4326 运输计划 (树链剖分+二分)

    Description 公元 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− 条双向航道,每条航道建立在两个星球之间,这 n− 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司, ...

  9. Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5020  Solved: 1872[Submit][Status ...

随机推荐

  1. 解决laravel中环境配置不起作用的方法

    博客已经迁移到www.imyzf.com,本站不再更新,请谅解! laravel有个环境配置选项很好用,在bootstrap/start.php中,曾经百度到这里面加入域名,就可以自动选择环境 $en ...

  2. JQuery 事件器的介绍

    基本用法 $(元素). 事件( 事件属性); 常见事件 示例 说明 $(selector).click()  被选元素的点击事件 $(selector).dblclick()  被选元素的双击事件 $ ...

  3. lua中的时间函数

    -- 获取当前的格林尼治时间print(os.time())-- 获取当前时间的字符串表示,形如:11/28/08 10:28:37print(os.date())-- 获取当前日期的字符串表示,形如 ...

  4. hive 存储格式

    hive有textFile,SequenceFile,RCFile三种文件格式. textfile为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理. Seq ...

  5. swfupload 上传控件的配置

    第一:下载swfupload控件,点击下载: 第二,解压缩后,在项目中添加这四个文件,如图: 然后,在你的js文件中添加这段代码: /** * *定义swfupload配置文件对象 **/ var s ...

  6. 纯JavaScript实现一些小功能

    题目链接:http://wenku.baidu.com/link?url=7Gbarr5q9X6h1QFRVAsHmfPp1xXagG209mvrJqBogseb4WLeRqbVKwxQieoh8SL ...

  7. simplest_dll 最简dll的创建与隐式调用(显式调用太麻烦,个人不建议使用)

    首先需要有个头文件,名字随便写  假设test.h //test.h #ifndef _TEST_H #define _TEST_H #ifdef TEST_EXPORTS //通过宏定义控制是输入还 ...

  8. Vases and Flowers

    hdu4614:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给你n个花瓶,然后有两种操作:1从a开始选择b个花瓶,放进花,输出左端点,右端点 2 ...

  9. 设置Tomcat的UTF-8编码

    利用request.setCharacterEncoding("UTF-8");来设置Tomcat接收请求的编码格式,只对POST方式提交的数据有效,对GET方式提交的数据无效! ...

  10. java中path和classpath

    Path 路径,是java编译时需要调用的程序(如java,javac等)所在的地方; CLASSPATH的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从class ...