bzoj 2282: [Sdoi2011]消防
来源:互联网 发布:网络文化节 编辑:程序博客网 时间:2024/06/10 01:52
题意:
在一棵树中选一条长度不超过s的路径,使其他所有城市到这条路径的最远距离最小。
题解:
YY下,可以发现这一段一定是在树的直径上。(具体怎么证我也说不清)
求出树的直径然后单调一下就好了。
code:
#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using namespace std;int n,s;struct node{ int y,c,next;}a[600010];int len=0,last[300010];int st,ed,mx,son[300010],dis[300010],dep[300010];int q[300010],l=1,r=0;int ans=2147483647;int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}void ins(int x,int y,int c){ a[++len].y=y;a[len].c=c; a[len].next=last[x];last[x]=len;}void dfs(int x,int fa,int c){ dis[x]=dis[fa]+c; for(int i=last[x];i;i=a[i].next) { int y=a[i].y; if(y==fa) continue; dfs(y,x,a[i].c); if(dep[y]+a[i].c>dep[x]) dep[x]=dep[y]+a[i].c,son[x]=y; }}void pre(int x,int fa,int op){ for(int i=last[x];i;i=a[i].next) { int y=a[i].y; if(y==fa) continue; if(op==1&&y==son[x]) continue; pre(y,x,0); dep[x]=max(dep[x],dep[y]+a[i].c); } if(son[x]&&op==1) pre(son[x],x,1);}int deepest;void solve(int x,int fa){ while(dis[x]-dis[fa]>s) fa=son[fa]; while(l<=r&&dis[q[l]]<dis[fa]) l++; while(l<=r&&dep[q[r]]<=dep[x]) r--; q[++r]=x; int t=max(dep[q[l]],max(dis[fa],deepest-dis[x])); ans=min(t,ans); if(son[x]) solve(son[x],fa);}int main(){ n=read();s=read(); for(int i=1;i<n;i++) { int x,y,c;x=read();y=read();c=read(); ins(x,y,c);ins(y,x,c); } dis[0]=0;dfs(1,0,0);mx=-1; for(int i=1;i<=n;i++) if(mx<dis[i]) mx=dis[i],st=i; memset(son,0,sizeof(son)); memset(dep,0,sizeof(dep)); dfs(st,0,0);deepest=dep[st]; memset(dep,0,sizeof(dep));pre(st,0,1); solve(st,st); printf("%d",ans);}
阅读全文
1 0
- BZOJ 2282: [Sdoi2011]消防
- bzoj 2282: [Sdoi2011]消防
- bzoj 2282: [Sdoi2011]消防
- Bzoj 2282: [Sdoi2011]消防(二分答案)
- 2282: [Sdoi2011]消防
- bzoj 2282: [Sdoi2011]消防(树的直径+二分)
- [BZOJ]2282: [Sdoi2011]消防 树的直径+单调队列
- [SDOI2011]消防
- BZOJ 1999 [Noip2007]树网的核(2282 [Sdoi2011]消防)
- 2282: [Sdoi2011]消防 树的直径+二分答案
- [BZOJ2282][Sdoi2011]消防(二分+贪心)
- [bzoj2282][Sdoi2011]消防(树上乱搞+二分)
- 二分+树的直径 [Sdoi2011]消防
- 【BZOJ - 2243】 SDOI2011 染色
- BZOJ 2243: [SDOI2011]染色
- 【BZOJ 2243】 [SDOI2011]染色
- bzoj 2243: [SDOI2011]染色
- 【BZOJ 2242】 [SDOI2011]计算器
- Git笔记
- hadoop基本命令
- 敏捷过程和极限编程(XP)
- 虚拟机中安装Ubuntu16.04以及VMwareTools
- bzoj 1562: [NOI2009]变换序列 匈牙利算法
- bzoj 2282: [Sdoi2011]消防
- JEESZ分布式框架安装和使用
- Intent的Bundle传值
- ucos2裁剪
- 微信小程序页面传值详解
- 初识Java线程池
- 本网站response.sendRedirect跳转到别人网站的时候,会被本网站的Filter拦截
- html5标签
- SpringBoot 极简MyBatis分页插件