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,则答案一定不小于该最大值,并以之为下界二分直径端点到路径端点的距离,取最小。

【代码】

 #include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int N = *1e5+;
const int INF = 1e9; struct Edge{ int v,w; };
vector<Edge> g[N];
int n,S,que[N],qz,dis[N],mark[N],fa[N]; void read(int& x) {
char c=getchar(); int f=; x=;
while(!isdigit(c)) {if(c=='-')f=-; c=getchar();}
while(isdigit(c)) x=x*+c-'',c=getchar();
x*=f;
} queue<int> q;
void bfs(int u) {
q.push(u); fa[u]=-;
FOR(i,,n) dis[i]=INF; dis[u]=;
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=;i<g[u].size();i++) {
int v=g[u][i].v;
if(v!=fa[u]) {
fa[v]=u; q.push(v);
if(mark[v]) dis[v]=dis[u];
else dis[v]=min(dis[v],dis[u]+g[u][i].w);
}
}
}
}
bool can(int ML) {
int l=,r=qz;
while(l<=qz && que[]-que[l+]<=ML) l++;
while(r && que[r-]-que[qz]<=ML) r--;
return que[l]-que[r]<=S;
} int main() {
read(n),read(S);
int u,v,w,x=,y=,dist,L=,R=,M;
FOR(i,,n-) {
read(u),read(v),read(w);
g[u].push_back((Edge){v,w});
g[v].push_back((Edge){u,w});
}
bfs(); FOR(i,,n) if(dis[i]>dis[x]) x=i;
bfs(x); FOR(i,,n) if(dis[i]>dis[y]) y=i;
int t=y; R=dis[y]-dis[x];
while(t!=x) {
que[++qz]=dis[t]; mark[t]=;
t=fa[t];
}
que[++qz]=dis[t];
bfs(x);
FOR(i,,n) L=max(L,dis[i]);
while(L<R) {
M=(L+R)>>;
if(can(M)) R=M; else L=M+;
}
printf("%d",L);
return ;
}

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. ibatis访问oracle数据库US7ASCII中文乱码问题

    今天碰到一个问题,使用ibatis框架访问编码为US7ASCII的oracle数据中文乱码, 找了很久终于有了解决方案 首先 SqlMap-Config.xml按如下配置 <sqlMapConf ...

  2. WPF的ScrollViewer鼠标的滚动

    在C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果是鼠标滚动整个S ...

  3. Java集合框架类图

    Java集合框架的类图 http://blog.toruneko.net/28

  4. java JDBC操作MySQL数据库

    一,首先在MYSQL建立一个数据库,例如Geek99DB: create database Geek99DB; use Geek99DB; 然后建立一个表CustomerTab: create tab ...

  5. 【gradle】 入门

    robin@robin-PC2 /D/JavaWorkSpace/payment/alipay-wap (master)$ ./gradlew idea

  6. Java注释模板

    /**   *    * 项目名称:${project_name}   * 类名称:${type_name}   * 类描述:   * 创建人:${user}   * 创建时间:${date} ${t ...

  7. Tesseract 3.02中文字库训练

    Tesseract 3.02中文字库训练 下载chi_sim.traindata字库下载tesseract-ocr-setup-3.02.02.exe 下载jTessBoxEditor用于修改box文 ...

  8. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛

    Description 约翰的牛们非常害怕淋雨,那会使他们瑟瑟发抖.他们打算安装一个下雨报警器,并且安排了一个撤退计划.他们需要计算最少的让所有牛进入雨棚的时间.    牛们在农场的F(1≤F≤200 ...

  9. XSS脚本攻击漫谈

    XSS跨站脚本攻击一直都被认为是客户端  Web安全中最主流的攻击方式.因为  Web环境的复杂性以及 XSS跨站脚本攻击的多变性,使得该类型攻击很难彻底解决.那么,XSS跨站脚本攻击具体攻击行为是什 ...

  10. Codeforces Round #208 (Div. 2)

    A - Dima and Continuous Line 水题:直接模拟: #include<cstdio> #define maxn 1005 using namespace std; ...