Description

小 T打算在城市C开设一家外送快餐店。送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近 的地方。 快餐店的顾客分布在城市C的N 个建筑中,这N 个建筑通过恰好N 条双向道路连接起来,不存在任何两条道路连接了相同的两个建筑。任意两个建筑之间至少存在一条由双向道路连接而成的路径。小T的快餐店可以开设在任一建筑 中,也可以开设在任意一条道路的某个位置上(该位置与道路两端的建筑的距离不一定是整数)。 现给定城市C的地图(道路分布及其长度),请找出最佳的快餐店选址,输出其与最远的顾客之间的距离。

Input

第一行包含一个整数N,表示城市C中的建筑和道路数目。
接下来N行,每行3个整数,Ai,Bi,Li(1≤i≤N;Li>0),表示一条道路连接了建筑Ai与Bi,其长度为Li 。

Output

仅包含一个实数,四舍五入保留恰好一位小数,表示最佳快餐店选址距离最远用户的距离。
注意:你的结果必须恰好有一位小数,小数位数不正确不得分。

Sample Input

1 2 1
1 4 2
1 3 2
2 4 1

Sample Output

2.0

HINT

数据范围

对于 10%的数据,N<=80,Li=1;

对于 30%的数据,N<=600,Li<=100;

对于 60% 的数据,N<=2000,Li<=10^9;

对于 100% 的数据,N<=10^5,Li<=10^9

  这个DP有点屌……

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. typedef long long LL;
  6. const int N=;
  7. int n,cnt,fir[N],nxt[N<<],to[N<<];
  8. LL val[N<<],dis[N],ans,sum,Mx;
  9. LL u1[N],v1[N],b[N],c[N];
  10. LL u2[N],v2[N];
  11. bool ring[N];
  12. void addedge(int a,int b,int v){
  13. nxt[++cnt]=fir[a];
  14. val[cnt]=v;
  15. fir[a]=cnt;
  16. to[cnt]=b;
  17. }
  18.  
  19. int ID[N],tot;
  20. int st[N],top;
  21. int pre[N];
  22. void DFS(int x){
  23. ID[x]=++tot;
  24. for(int i=fir[x],y;i;i=nxt[i])
  25. if((y=to[i])!=pre[x]){
  26. if(!ID[y]){
  27. pre[y]=x;
  28. c[y]=val[i];
  29. DFS(y);
  30. }
  31. else if(ID[y]>ID[x]){
  32. while(x!=y){
  33. st[++top]=y;
  34. b[top]=c[y];
  35. ring[y]=true;
  36. y=pre[y];
  37. }
  38. st[++top]=x;
  39. b[top]=val[i];
  40. ring[x]=true;
  41. return;
  42. }
  43. }
  44. }
  45.  
  46. void DP(int x,int fa){
  47. for(int i=fir[x];i;i=nxt[i])
  48. if(to[i]!=fa&&!ring[to[i]]){
  49. DP(to[i],x);
  50. ans=max(ans,dis[x]+dis[to[i]]+val[i]);
  51. dis[x]=max(dis[x],dis[to[i]]+val[i]);
  52. }
  53. }
  54.  
  55. int main(){
  56. freopen("foodshop.in","r",stdin);
  57. freopen("foodshop.out","w",stdout);
  58. scanf("%d",&n);
  59. for(int i=,x,y,v;i<=n;i++){
  60. scanf("%d%d%d",&x,&y,&v);
  61. addedge(x,y,v);addedge(y,x,v);
  62. }
  63. DFS();
  64. for(int i=;i<=top;i++)DP(st[i],);
  65.  
  66. for(int i=;i<=top;i++){
  67. sum+=b[i-];
  68. u1[i]=max(u1[i-],sum+dis[st[i]]);
  69. v1[i]=max(v1[i-],sum+dis[st[i]]+Mx);
  70. Mx=max(Mx,dis[st[i]]-sum);
  71. }
  72. LL tmp=b[top];Mx=sum=b[top]=;
  73. for(int i=top;i>=;i--){
  74. sum+=b[i];
  75. u2[i]=max(u2[i+],sum+dis[st[i]]);
  76. v2[i]=max(v2[i+],sum+dis[st[i]]+Mx);
  77. Mx=max(Mx,dis[st[i]]-sum);
  78. }
  79. LL Mn=v1[top];
  80. for(int i=;i<top;i++)
  81. Mn=min(Mn,max(max(v1[i],v2[i+]),tmp+u1[i]+u2[i+]));
  82. ans=max(ans,Mn);
  83. printf("%.1lf",ans/2.0);
  84. return ;
  85. }

动态规划:NOI2013 快餐店的更多相关文章

  1. bzoj 3242: [Noi2013]快餐店 章鱼图

    3242: [Noi2013]快餐店 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 266  Solved: 140[Submit][Status] ...

  2. P1399 [NOI2013] 快餐店 方法记录

    原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...

  3. bzoj3242 [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  4. 3242: [Noi2013]快餐店 - BZOJ

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  5. NOI2013 快餐店

    http://uoj.ac/problem/126 总的来说,还是很容易想的,就是有点恶心. 首先,很明显只有一个环. 我们先找出这个环,给各棵树编号id[i],然后各棵树分别以环上的点为根,求出每个 ...

  6. bzoj 3242: [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  7. BZOJ3242/UOJ126 [Noi2013]快餐店

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径

    传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...

  9. 【uoj126】 NOI2013—快餐店

    http://uoj.ac/problem/126 (题目链接) 题意 求基环树直径. Solution zz选手迟早退役,唉,右转题解→_→:LCF 细节 拓扑排序的时候度数为0时入队.我在想什么w ...

随机推荐

  1. 16、SQL Server 复制及常见错误处理

    SQL Server 复制 复制是一组技术的组合,可以用此组合对数据和数据库对象进行复制由一个数据库移动到另一个数据库. 复制的英文是Replication,重复的意思,而不是Copy.复制的核心功能 ...

  2. 处理移动端click事件300ms延迟的好方法—FastClick

    下载地址:https://github.com/ftlabs/fastclick 1.click事件为什么有延迟? “...mobile browsers will wait approximatel ...

  3. weex-toolkit打包

    需要2.15.1及以上的npm支持 运行终端,查看版本 npm --version 如果版本低于2.15.1,需要更新 sudo npm install -g npm 安装weex-toolkit n ...

  4. C#重载重写

    overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字.override:过载也称重写是指子类对父类中虚函数或抽象函数的“覆盖 ...

  5. VS中监视窗口,即时窗口和输出窗口的使用

    一.监视窗口 1.配置应用程序,使应用程序处于调试状态. 2.点击“调试”----“窗口”----“监视”----“监视1”,打开监视窗口. 3.在监视窗口中“名称”栏中输入变量名称或html元素id ...

  6. XFire构建服务端Service的两种方式(转)

    XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...

  7. ueditor爬坑

    在使用UeEditor中遇到几个个坑 1.添加的html代码中使用的样式class被guolv掉 解决方案:在ueditor.config.js中,xss过滤白名单中,每个元素添加class,如下图 ...

  8. JS实现页面跳转重定向的几种方式

    1.重定向 <script language="javascript"type="text/javascript">  window.locatio ...

  9. [LeetCode OJ] Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  10. Asp.net 实现图片缩放 无水印(方法二)

    public static System.Drawing.Image GetImage(string path) { try { if (path.StartsWith("http" ...