bzoj 2282: [Sdoi2011]消防
来源:互联网 发布:wingware python ide 编辑:程序博客网 时间:2024/06/02 12:04
题意:在一棵树中选一条长度不超过
题解:树的直径+单调队列
先求出树的直径,再用单调队列搞一搞就好了。
代码:
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#include<vector>using namespace std;int n,s,num=0,fst[300010],dis[300010],pre[300010],maxd[300010],dd[300010],ans=2147483647;struct edge{ int x,y,c,n;}e[600010];bool v[300010];vector<int>d,en;void ins(int x,int y,int c){ e[++num]={x,y,c,fst[x]}; fst[x]=num;}int bfs(int s){ static queue<int>q; q.push(s); memset(dis,63,sizeof(dis)); dis[s]=0; v[s]=1; int t=s; memset(pre,0,sizeof(pre)); while(!q.empty()) { int x=q.front(); v[x]=0; if(dis[x]>dis[t]) t=x; for(int i=fst[x];i;i=e[i].n) { int y=e[i].y; if(!v[y]&&dis[y]>dis[x]+e[i].c) { dis[y]=dis[x]+e[i].c; pre[y]=i; v[y]=1; q.push(y); } } q.pop(); } return t;}int main(){ scanf("%d%d",&n,&s); for(int i=1;i<n;i++) { int x,y,c; scanf("%d%d%d",&x,&y,&c); ins(x,y,c); ins(y,x,c); } int st=bfs(1); memset(v,0,sizeof(v)); int ed=bfs(st); for(int i=ed;i;i=e[pre[i]].x) { v[i]=1; d.push_back(i); en.push_back(pre[i]); } for(int i=0;i<d.size();i++) { maxd[i]=dis[bfs(d[i])]; v[d[i]]=1; } dd[0]=0; for(int i=0;i<d.size()-1;i++) dd[i+1]=dd[i]+e[en[i]].c;/* for(int i=0;i<d.size();i++) printf("d:%d en:%d maxd:%d dd:%d\n",d[i],en[i],maxd[i],dd[i]);*/ int l=0; deque<int>q; for(int r=0;r<d.size();r++) { while(!q.empty()&&maxd[r]>q.back()) q.pop_back(); q.push_back(maxd[r]); while(dd[r]-dd[l]>s) { if(maxd[l]==q.front()) q.pop_front(); l++; } ans=min(ans,max(max(max(dd[l],maxd[l]),max(dd[d.size()-1]-dd[r],maxd[r])),q.front()));// printf("%d %d %d\n",l,r,ans); } printf("%d",ans);}
阅读全文
0 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]计算器
- 三、完善内核功能:添加字符、字符串、整数打印功能
- ASCII码排序
- 尝试自己造一个上下拉刷新控件
- wordpress与xampp来搭建,建站环境
- SPI与I2C(待补充)
- bzoj 2282: [Sdoi2011]消防
- 仿百度分页
- jQuery Ajax 返回值
- CXF 拦截器预处理request、response消息
- SecureCRT远程连接虚拟机CentOS的三种方式
- ShopStore项目总结(一)
- Average of Levels in Binary Tree
- C语言——\r\n 和 \n的区别
- 程序员之思考