题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2282

答案一定是在直径上的一段,然后答案一定不会小于不在直径上的点到直径的距离(要是可以的话那当前这条直径就不是直径了)

然后二分一遍,当前段的最长答案只可能在s->l,r->t取到,其他都是取不到的所以判断这两个就可以了。

#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<set>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 300500
#define inf int(1e9)
#define mm 1000000007
typedef long long ll;
using namespace std;
struct data{int obj,pre;ll c;
}e[maxn*];
int dis[maxn],num[maxn],D,l,r,mid,S;
int n,tot,cnt,s,t,st[maxn],head[maxn],fa[maxn],mark[maxn];
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
return x*f;
}
void insert(int x,int y,int z){
e[++tot].obj=y; e[tot].pre=head[x]; e[tot].c=z; head[x]=tot;
}
void bfs(int s){
rep(i,,n) dis[i]=-; dis[s]=;
queue<int> q; q.push(s);
while (!q.empty()){
int u=q.front(); q.pop();
for (int j=head[u];j;j=e[j].pre){
int v=e[j].obj;
if (dis[v]==-) {
fa[v]=u;
if (!mark[v]) dis[v]=dis[u]+e[j].c; else dis[v]=dis[u];
q.push(v);
}
}
}
}
bool jud(int D){
int l=,r=cnt;
while (l<cnt&&num[]-num[l+]<=D) l++;
while (r>&&num[r-]<=D) r--;
return num[l]-num[r]<=S;
}
int main(){
// freopen("in.txt","r",stdin);
n=read(); S=read();
rep(i,,n-){
int x=read(),y=read(); int z=read();
insert(x,y,z); insert(y,x,z);
}
bfs(); rep(i,,n) if (dis[i]>dis[s]) s=i;
bfs(s); rep(i,,n) if (dis[i]>dis[t]) t=i;
D=dis[t];
int now=t; st[++cnt]=t; num[cnt]=dis[t];
while (now!=s){
now=fa[now]; mark[now]=;
st[++cnt]=now;
num[cnt]=dis[now];
}
bfs(s);
rep(i,,n) l=max(l,dis[i]); r=D;
if (S<D){
while (l<=r){
ll mid=(l+r)/;
if (jud(mid)) r=mid-;
else l=mid+;
}
}
printf("%d\n",l);
return ;
}

BZOJ2282: [Sdoi2011]消防的更多相关文章

  1. BZOJ2282 SDOI2011消防/NOIP2007树网的核(二分答案+树形dp)

    要求最大值最小容易想到二分答案.首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的.那么如果剩下的点数量>=3,显然该答 ...

  2. NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防

    NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...

  3. 【BZOJ2282】[Sdoi2011]消防 树形DP+双指针法+单调队列

    [BZOJ2282][Sdoi2011]消防 Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这 ...

  4. [洛谷P2491] [SDOI2011]消防

    洛谷题目链接:[SDOI2011]消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超 ...

  5. [SDOI2011]消防(树的直径)

    [SDOI2011]消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情, ...

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

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

  7. [SDOI2011]消防(贪心,图论,树的直径)

    [SDOI2011]消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情, ...

  8. BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防

    一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...

  9. 【bzoj2282】[Sdoi2011]消防

    两次bfs可得直径,答案一定不会小于所有点到直径的距离最大值,只要把直径上的边权设为0,任选直径上一点bfs可得将最大值作为二分下界,二分直径左右端点的舍弃部分 #include<algorit ...

随机推荐

  1. 引言关于本博客的ES6

    本博客ES6全部取自于阮一峰的<ES6标准入门>里面掺杂着一些node.js,写这些东西是为了让大家更好的去理解这本书,其实更像是一个教材参考,里面有一些是阮一峰先生可能没有考虑到新手的某 ...

  2. iOS 页面之间的专长动画控制器间的转换

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 24.0px; font: 14.0px "Heiti SC Light" ...

  3. java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)

    这两个类都是继承自AbstractStringBuilder,AbstractStringBuilder有两个成员属性 char[] value; int count; 前者用于存储字符串,后者用于统 ...

  4. ABP 用swagger UI测试API报401无权限访问问题

    问题描述: 当我们用swagger UI对Web API 进行测试时报401错误 我们点开GET /api/services/app/Role/GetAll,输入参数 点击Try it out!按钮, ...

  5. 关于C++函数返回局部对象的详细分析

    以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的.因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通 ...

  6. [置顶] xamarin android自定义标题栏(自定义属性、回调事件)

    自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...

  7. lesson - 1 - IP /DNS /cat !$ /putty 知识扩充

    一.知识点扩充 1.嵌入式Linux 开发与运维 .安卓手机  .     Linux真正的用武之地是蓬勃发展的信息接入设备市 场.这些新兴的设备只有有限的内存,价格也只有几百美元,因此开发者需要新的 ...

  8. linux 写U盘出现的问题

    在写U盘的时候,报了这样的错,记录如下: umount /dev/sdb // 提示未挂载 mkfs.vfat /dev/sdb // device or resource busy umount / ...

  9. Activemq集群搭建

    集群搭建 一:静态网络集群 1.简介 ​ 当ActiveMQ面对大量消息存储和大量Client交互时,性能消耗将会达到单个broker极限,此时我们需要对ActiveMQ进行水平扩展.ActiveMQ ...

  10. glibc-commons 依赖解析 版本错误,xxx is duplicate yyy

    glibc-commons 安装了两个版本,导致依赖glibc-commons的很多软件包 被安装了两个版本: 解决办法就是 先清除这些重复的已安装的软件,然后执行 yum update 将 glib ...