这个题要求最大值最小,那就是铁打的二分

然后考虑检验,可以根据二分值卡极限找距离然后判断是不是一条路径再判断路径和

这样其实dp就可以做了,但有更方便的做法,就是求出直径然后变成队列操作,

由于直径上的点最远的点都在直径上,所以就只用判断直径,

下限是非直径点到直径的最大距离

上限是直径长度

但注意有可能直径上的边每一条都比s大,这时需要扫一遍所有的边,判断这条边到直径两个端点的距离即可(数据没卡就没写)

码:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define N 600005
int fu[N],l,r,d[N],rt,zz,maxx,i,j,n,m,s,x,y,z,qsum[N],xx,ch[N],ans;
bool bj[N];
vector<int>v[N],c[N];
void dfs1(int o,int fa,int dis)
{
int i;
fu[o]=fa;
if(!rt){if(dis>maxx)maxx=dis,xx=o;}
else if(dis>maxx)maxx=dis,zz=o;for(i=0;i<v[o].size();i++){int nd=v[o][i];   if(nd==fa)continue;dfs1(nd,o,dis+c[o][i]);}
}
void dfs2(int o,int fa)
{d[o]=0;int i,nd;if(bj[o]){for(i=0;i<v[o].size();i++){nd=v[o][i];   if(nd==fa)continue;dfs2(nd,o);if(bj[nd]==0)l=max(l,d[nd]+c[o][i]);            }   }else{for(i=0;i<v[o].size();i++){nd=v[o][i]; if(nd==fa)continue;dfs2(nd,o);d[o]=max(d[o],d[nd]+c[o][i]);}        }
}
int main()
{scanf("%d%d",&n,&s);for(i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);v[x].push_back(y);c[x].push_back(z);v[y].push_back(x);c[y].push_back(z);   r+=z; }dfs1(1,0,0);rt=xx;maxx=0;dfs1(rt,0,0);int o=zz;while(rt!=o){bj[o]=1;for(i=0;i<v[fu[o]].size();i++)if(v[fu[o]][i]==o)ch[fu[o]]=o,qsum[fu[o]]=qsum[o]+c[fu[o]][i];o=fu[o];  }bj[o]=1;dfs2(rt,0);r++;while(l<r){int mid=(l+r)>>1;int z1=rt,z2=zz;
while(z1!=z2&&qsum[rt]-qsum[ch[z1]]<=mid)z1=ch[z1];
while(z1!=z2&&qsum[fu[z2]]<=mid)z2=fu[z2];if(z1==z2)r=mid;if(qsum[z1]-qsum[z2]<=s){ans=mid;r=mid;    }else l=mid+1;    }
printf("%d",ans);
}

bzoj2282 [Sdoi2011]消防 直径+二分+树dp相关推荐

  1. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

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

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

  3. 二分+树的直径 [Sdoi2011]消防

    问题 D: [Sdoi2011]消防 时间限制: 1 Sec 内存限制: 512 MB 提交: 12 解决: 6 [提交][状态][讨论版] 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且 ...

  4. CodeForces - 487B Strip(线段树+dp+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...

  5. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  6. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Jav ...

  7. 树的直径,树的中心,树的重心

    树的直径,树的中心,树的重心 树的直径:树上两点间最长距离所对应的路径 求法一:树形dp: 从每个点向下搜索,找到以该点为根到子节点的最大值和次大值 然后将次大值和最大值相加,即求得经过该点的最长路径 ...

  8. 【暖*墟】#动态规划# 基环树DP的学习与练习

    因为弃置了 四边形不等式优化 ,所以DP的任务还剩下 基环树DP / 插头DP / 动态DP 当然,树形DP / 状压DP / 数位DP / 斜率优化DP 也还是要练习的...... 一 . 基环树的 ...

  9. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

最新文章

  1. 1026 Modular multiplication of polynomials
  2. 5年 Python 功力,总结了 10 个开发技巧
  3. 看看这套WPF开源基础控件库:WPFDevelopers
  4. java开发引擎_【java规则引擎】java规则引擎搭建开发环境
  5. Python实现立方体纹理映射
  6. 中国人工智能学会最高荣誉CAAI Fellow出炉,首批53位大牛,姚期智谭铁牛等入选
  7. on() 和 click() 的区别:二者在绑定静态控件时没有区别,但是如果面对动态产生的控件,只有 on() 能成功的绑定到动态控件中。以下实例中原先的 HTML 元素点击其身后的 Dele
  8. centos7.3 防火墙设置
  9. Android连接USB打印机
  10. 阿里巴巴-飞猪 电话面试
  11. ML-Agents案例之金字塔
  12. linux u盘启动制作教程,cdlinux u盘启动制作教程
  13. uni-app第三方插件 根据银行卡卡号查询银行类型和卡类型
  14. 谷歌插件学习必备准备知识代码提示插件调试
  15. ps如何把自己的图与样机结合_如何利用PS制作贴图样机那
  16. mPass 微服务开发平台
  17. 制作ubuntu引导盘,到安装Ubuntu系统流程
  18. java swing组件_Java -- Swing 组件使用
  19. ThreadLocal是什么
  20. 谁在说谎剧情详细介绍

热门文章

  1. 红橙Darren视频笔记 模板模式的应用与BaseActivity
  2. 2021-09-26 关于打开Ubuntu的main universe restricted
  3. TikZ绘图示例——尺规作图:直角的画法(一)
  4. 计算机图形学E10——Bezier曲线
  5. 打开Jupyter Notebook 时报错:EnvironmentLocationNotFound: Not a conda environment:
  6. ctype库中关于字符串的常用函数汇总
  7. Python练习:七段数码管绘制
  8. 微信小程序official-account组件的使用及样式设置
  9. python数据分析常用类库(1.1)
  10. docker 运行windows程序_如何从Windows上运行任何Linux图形GUI程序?