题意:给定一张有向稠密图和通过每条边的时间和路程,问从1到n的路程/时间 最大为多少

正解:SPFA+二分答案

开始做的时候,想直接跑图论,后来发现好像不对(不然数据范围怎么这么小)

但是显然要用到图论,机智的我就想到了二分答案。

考虑,假如有一个ans,那么如果存在length i / time i >=ans(i属于路径上的边),那么显然更优 ,则可发现问题可转换为如果一个答案更优,那么对于以 length i - ans*time i 为权值,重新构的图中,如果到达n的最长路不小于n,显然答案可以更优,只需要二分答案就可以了.另外如果有正权环显然是可以的  

唯独要注意的是,精度要求要满足题意,显然不能只分到第三位小数就停了,那样的话会gi

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9. using namespace std;
  10. const int MAXN = ;
  11. int n;
  12. int tim[MAXN][MAXN],s[MAXN][MAXN];
  13. long double ju[MAXN][MAXN];
  14. double dis[MAXN];
  15. bool vis[MAXN];
  16. int num[MAXN];//记录经过次数,判环
  17. long double ans;
  18. //二分答案+SPFA
  19.  
  20. queue<int>q;
  21.  
  22. inline int getint()
  23. {
  24. int w=,q=;
  25. char c=getchar();
  26. while((c<'' || c>'') && c!='-') c=getchar();
  27. if (c=='-') q=, c=getchar();
  28. while (c>='' && c<='') w=w*+c-'', c=getchar();
  29. return q ? -w : w;
  30. }
  31.  
  32. inline bool work(long double x){//跑最长路径
  33. for(int i=;i<=n;i++) dis[i]=-0x7ffffff;//置为更小的负值
  34. // memset(dis,0,sizeof(dis));
  35. ans=x;
  36.  
  37. for(int i=;i<=n;i++)
  38. for(int j=;j<=n;j++)
  39. ju[i][j]=s[i][j]-x*tim[i][j];
  40.  
  41. memset(vis,,sizeof(vis));
  42. memset(num,,sizeof(num));
  43. while(!q.empty()) q.pop();
  44.  
  45. q.push(); vis[]=; dis[]=;
  46. while(!q.empty()) {
  47. int u=q.front();
  48. q.pop(); vis[u]=;
  49. for(int i=;i<=n;i++)
  50. if(i!=u){
  51. if(dis[i]<dis[u]+ju[u][i]) {
  52. dis[i]=dis[u]+ju[u][i];
  53. if(!vis[i]) {
  54. vis[i]=;
  55. q.push(i);
  56. num[i]++;
  57. if(num[i]>=n) return true;
  58. }
  59. }
  60. }
  61. }
  62.  
  63. if(dis[n]>=) return true;//存在更优的答案
  64. return false;
  65. }
  66.  
  67. int main()
  68. {
  69. n=getint();
  70. for(int i=;i<=n;i++) for(int j=;j<=n;j++) s[i][j]=getint();
  71. for(int i=;i<=n;i++) for(int j=;j<=n;j++) tim[i][j]=getint();
  72.  
  73. long double l=0.00,r=10000.00;
  74. //long double jingdu=0.00001;
  75. long double jingdu=0.0001;
  76. while(r-l-jingdu>=) {
  77. long double mid=l+(r-l)/2.0;
  78. if(work(mid)) l=mid;
  79. else r=mid;
  80. }
  81. printf("%.3lf",(double)l);
  82. return ;
  83. }

codevs1183泥泞的道路的更多相关文章

  1. codevs1183 泥泞的道路(01分数规划)

    1183 泥泞的道路  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description CS有n个小区,并且任意小区之间都有两 ...

  2. codevs1183 泥泞的道路

    题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...

  3. 【Codevs1183】泥泞的道路

    Position: http://codevs.cn/problem/1183/ List Codevs1183 泥泞的道路 List Description Input Output Sample ...

  4. Codevs 1183 泥泞的道路

    1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路 ...

  5. TYVJ P1577 泥泞的道路

    题目链接:http://www.tyvj.cn/p/1577# P1577 泥泞的道路 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 公园中有n个景点,编号 ...

  6. 泥泞的道路(codevs 1183)

    题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...

  7. codevs 1183 泥泞的道路 01分数规划

    题目链接 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和 ...

  8. CODEVS——T1183 泥泞的道路

    时间限制: 1 s  空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到 ...

  9. codevs 1183 泥泞的道路 (二分+SPFA+差分约束)

    /* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简 ...

随机推荐

  1. NodeJS 开篇 牛刀小试

    一.Node&NPM的安装与配置 下载:https://nodejs.org/en/ V4.2.x LTS(9.75MB)——长期支持版,成熟可靠 V5.x.x Stable(9.71MB)— ...

  2. 【HTML5+MVC4】xhEditor网页编辑器图片上传

    准备工作: 创建一个MVC项目中,添加好xhEditor插件 相关用法:http://www.cnblogs.com/xcsn/p/4701497.html 注意事项:xhEditor分为v1.1.1 ...

  3. 放松跑、间歇跑、节奏跑和LSD

    放松跑(easy run),顾名思义,是没有负担的跑步,通常用于高强度训练之间,让机能得到恢复. 间歇跑(intervals),又叫变速跑,通常是用高于实际比赛速配速的速度进行反复短距离的快跑,当中配 ...

  4. Tomcat部署学习

    tomcat也可以称为catalina catalina_home就是tomcat安装路径:D:\Program Files\apache-tomcat-8.0.36\bin     windows下 ...

  5. Linux shell运算符

    双引号 --使用双引号可以引用除了字符$,`(单反号),\(反斜杠)外的任意字符或者字符串 --echo "参数的个数是$#" 单引号 --单引号与双引号类似,不同的是shell会 ...

  6. web—第三章XHTML

     web—第三章XHTML 又是一周 我们学的了做表单:一开始我以为表单是表格.但结果:表单是以采集和提交用户输入数据的,这样讲很迷,说简单点就是登陆端.比如:Facebook.twitter.Ins ...

  7. 实现Linux与Windows下一致的命令行

    这其实是个非常简单的东西. 我们会写一些命令行的工具,一般跨平台的话,会用python或者perl写,比如叫foo.py,然后在Windows和Linux下调用这个脚本: Linux: foo.py ...

  8. 迭代器模式的一种应用场景以及C#对于迭代器的内置支持

    迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...

  9. 从源码角度看finish()方法的执行流程

    1. finish()方法概览 首先我们来看一下finish方法的无参版本的定义: /** * Call this when your activity is done and should be c ...

  10. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...