codevs1183泥泞的道路
题意:给定一张有向稠密图和通过每条边的时间和路程,问从1到n的路程/时间 最大为多少
正解:SPFA+二分答案
开始做的时候,想直接跑图论,后来发现好像不对(不然数据范围怎么这么小)
但是显然要用到图论,机智的我就想到了二分答案。
考虑,假如有一个ans,那么如果存在length i / time i >=ans(i属于路径上的边),那么显然更优 ,则可发现问题可转换为如果一个答案更优,那么对于以 length i - ans*time i 为权值,重新构的图中,如果到达n的最长路不小于n,显然答案可以更优,只需要二分答案就可以了.另外如果有正权环显然是可以的
唯独要注意的是,精度要求要满足题意,显然不能只分到第三位小数就停了,那样的话会gi
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<cstdlib>
- #include<algorithm>
- #include<queue>
- #include<vector>
- using namespace std;
- const int MAXN = ;
- int n;
- int tim[MAXN][MAXN],s[MAXN][MAXN];
- long double ju[MAXN][MAXN];
- double dis[MAXN];
- bool vis[MAXN];
- int num[MAXN];//记录经过次数,判环
- long double ans;
- //二分答案+SPFA
- queue<int>q;
- inline int getint()
- {
- int w=,q=;
- char c=getchar();
- while((c<'' || c>'') && c!='-') c=getchar();
- if (c=='-') q=, c=getchar();
- while (c>='' && c<='') w=w*+c-'', c=getchar();
- return q ? -w : w;
- }
- inline bool work(long double x){//跑最长路径
- for(int i=;i<=n;i++) dis[i]=-0x7ffffff;//置为更小的负值
- // memset(dis,0,sizeof(dis));
- ans=x;
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- ju[i][j]=s[i][j]-x*tim[i][j];
- memset(vis,,sizeof(vis));
- memset(num,,sizeof(num));
- while(!q.empty()) q.pop();
- q.push(); vis[]=; dis[]=;
- while(!q.empty()) {
- int u=q.front();
- q.pop(); vis[u]=;
- for(int i=;i<=n;i++)
- if(i!=u){
- if(dis[i]<dis[u]+ju[u][i]) {
- dis[i]=dis[u]+ju[u][i];
- if(!vis[i]) {
- vis[i]=;
- q.push(i);
- num[i]++;
- if(num[i]>=n) return true;
- }
- }
- }
- }
- if(dis[n]>=) return true;//存在更优的答案
- return false;
- }
- int main()
- {
- n=getint();
- for(int i=;i<=n;i++) for(int j=;j<=n;j++) s[i][j]=getint();
- for(int i=;i<=n;i++) for(int j=;j<=n;j++) tim[i][j]=getint();
- long double l=0.00,r=10000.00;
- //long double jingdu=0.00001;
- long double jingdu=0.0001;
- while(r-l-jingdu>=) {
- long double mid=l+(r-l)/2.0;
- if(work(mid)) l=mid;
- else r=mid;
- }
- printf("%.3lf",(double)l);
- return ;
- }
codevs1183泥泞的道路的更多相关文章
- codevs1183 泥泞的道路(01分数规划)
1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description CS有n个小区,并且任意小区之间都有两 ...
- codevs1183 泥泞的道路
题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...
- 【Codevs1183】泥泞的道路
Position: http://codevs.cn/problem/1183/ List Codevs1183 泥泞的道路 List Description Input Output Sample ...
- Codevs 1183 泥泞的道路
1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路 ...
- TYVJ P1577 泥泞的道路
题目链接:http://www.tyvj.cn/p/1577# P1577 泥泞的道路 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 公园中有n个景点,编号 ...
- 泥泞的道路(codevs 1183)
题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...
- codevs 1183 泥泞的道路 01分数规划
题目链接 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和 ...
- CODEVS——T1183 泥泞的道路
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到 ...
- codevs 1183 泥泞的道路 (二分+SPFA+差分约束)
/* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简 ...
随机推荐
- NodeJS 开篇 牛刀小试
一.Node&NPM的安装与配置 下载:https://nodejs.org/en/ V4.2.x LTS(9.75MB)——长期支持版,成熟可靠 V5.x.x Stable(9.71MB)— ...
- 【HTML5+MVC4】xhEditor网页编辑器图片上传
准备工作: 创建一个MVC项目中,添加好xhEditor插件 相关用法:http://www.cnblogs.com/xcsn/p/4701497.html 注意事项:xhEditor分为v1.1.1 ...
- 放松跑、间歇跑、节奏跑和LSD
放松跑(easy run),顾名思义,是没有负担的跑步,通常用于高强度训练之间,让机能得到恢复. 间歇跑(intervals),又叫变速跑,通常是用高于实际比赛速配速的速度进行反复短距离的快跑,当中配 ...
- Tomcat部署学习
tomcat也可以称为catalina catalina_home就是tomcat安装路径:D:\Program Files\apache-tomcat-8.0.36\bin windows下 ...
- Linux shell运算符
双引号 --使用双引号可以引用除了字符$,`(单反号),\(反斜杠)外的任意字符或者字符串 --echo "参数的个数是$#" 单引号 --单引号与双引号类似,不同的是shell会 ...
- web—第三章XHTML
web—第三章XHTML 又是一周 我们学的了做表单:一开始我以为表单是表格.但结果:表单是以采集和提交用户输入数据的,这样讲很迷,说简单点就是登陆端.比如:Facebook.twitter.Ins ...
- 实现Linux与Windows下一致的命令行
这其实是个非常简单的东西. 我们会写一些命令行的工具,一般跨平台的话,会用python或者perl写,比如叫foo.py,然后在Windows和Linux下调用这个脚本: Linux: foo.py ...
- 迭代器模式的一种应用场景以及C#对于迭代器的内置支持
迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...
- 从源码角度看finish()方法的执行流程
1. finish()方法概览 首先我们来看一下finish方法的无参版本的定义: /** * Call this when your activity is done and should be c ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...