洛谷3761,TJOI2017城市
来源:互联网 发布:迪优美特网络机顶盒c6 编辑:程序博客网 时间:2024/05/22 12:27
这道题一开始在想可以枚举每个点对,尝试删除其间的边,因为有
后来发现,因为是树,所以只有
首先定义在一棵树
对于一条边连接的两颗子树
在所有边的值取出最小的,就是答案。
对于一棵树,如何求出
为什么
证明:如果
如果
因为总共有
可是,当原树为链时,剪枝就失效了,所以我对于链特判了一下,没有重新找直径。
最后,我去bzoj上交了一发,好像是rank2.rank1怎么那么快?
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;typedef unsigned int ui;struct edge{ int to,d;}x;const int N=5010;vector<edge> g[N];int n,i,u,v,d,ans,y,z,a[N],w,j,ff,sss,ttt,c[N],ww,cc[N],ss,tt,aa[N];bool b[N],bb[N];ui k;void dfs1(int x,int dep,int fa){ if(dep>d)d=dep,v=x; for(ui k=0;k<g[x].size();++k) if(!b[g[x][k].to] && g[x][k].to!=fa) dfs1(g[x][k].to,dep+g[x][k].d,x);}void dfs2(int x,int dep,int fa){ if(dep>y)y=dep,z=x; for(ui k=0;k<g[x].size();++k)if(!b[g[x][k].to] && g[x][k].to!=fa)dfs2(g[x][k].to,dep+g[x][k].d,x);}bool dfs3(int x,int dep,int fa){ a[++w]=dep; c[w]=x; if(x==z)return 1; for(ui k=0;k<g[x].size();++k)if(!b[g[x][k].to] && g[x][k].to!=fa)if(dfs3(g[x][k].to,dep+g[x][k].d,x))return 1; --w; return 0;}inline int got(int u){ memset(bb,0,sizeof bb); dfs1(v=u,d=0,0); dfs2(v,y=0,w=0); dfs3(v,0,0); for(j=1;j<=w;++j) if(a[j]<=y>>1 && a[j+1]>=y>>1){ ff+=min(max(a[j],y-a[j]),max(a[j+1],y-a[j+1])); break; } return y;}int main(){ scanf("%d",&n); for(i=1;i<n;++i){ scanf("%d%d%d",&u,&v,&d); g[u].push_back((edge){v,d}); g[v].push_back((edge){u,d}); } ans=1<<30; dfs1(u,d=0,0); dfs2(v,y=0,w=0); dfs3(v,0,0); for(i=1,ww=w;i<=w;++i)cc[i]=c[i],aa[i]=a[i]; if(w==n){ for(i=2;i<=ww;++i){ ss=cc[i-1]; tt=cc[i]; ff=0; y=a[ss]; for(j=1;j<=ss;++j) if(a[j]<=y>>1 && a[j+1]>=y>>1){ ff+=min(max(a[j],y-a[j]),max(a[j+1],y-a[j+1])); break; } y=a[n]-a[tt]; for(j=tt;j<=n;++j) if(a[j]-a[tt]<=y>>1 && a[j+1]-a[tt]>=y>>1){ ff+=min(max(a[j]-a[tt],y-a[j]+a[tt]),max(a[j+1]-a[tt],y-a[j+1]+a[tt])); break; } ans=min(ans,max(max(a[ss],a[n]-a[tt]),ff+aa[i]-aa[i-1])); b[i]=0; } return printf("%d\n",ans),0; } for(i=2;i<=ww;++i){ ss=cc[i-1]; tt=cc[i]; ff=0; b[ss]=1; sss=got(tt); b[ss]=0; b[tt]=1; ttt=got(ss); ans=min(ans,max(max(sss,ttt),ff+aa[i]-aa[i-1])); b[i]=0; } return printf("%d\n",ans),0;}
阅读全文
0 0
- 洛谷3761,TJOI2017城市
- 4890: [Tjoi2017]城市
- [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组
- BZOJ 4887 [Tjoi2017] 可乐
- BZOJ 4888 [Tjoi2017] 异或和
- bzoj4829 [TJOI2017]dna(后缀数组)
- bzoj4887 [Tjoi2017]可乐(dp+矩阵倍增)
- 洛谷 P1453 城市环路
- 城市
- 城市
- 城市
- 城市
- 《城市》
- 洛谷U14959 模拟城市2.0
- 新城市,旧城市
- 一线城市 二线城市
- [JSOI2007]重要的城市(x)(洛谷1841)
- 洛谷P2061 [USACO07OPEN]城市的地平线City Horizon
- 值得推荐的C/C++框架和库 (真的很强大)
- sklearn: linear_model
- 33 款主宰 2017 iOS 开发的开源库
- Mac 显示隐藏文件
- 表征因果行动理论及其在应答集编程中的实现
- 洛谷3761,TJOI2017城市
- Android中性能优化(apk瘦身)
- H5+ 二维码扫描功能
- peewee 中文翻译文档
- 安卓学习
- Kali linux下解决wps office 安装以及依赖问题
- 一个极好的ALV例子
- 广义表的建立与一般操作
- tensorflow基本语法