codevs1183 泥泞的道路
2015-10-09 19:43
381 查看
题意:
给出n个点的有向图,每条边有两个参数(路程(len)和时间(time)),求从1号点出发到N号点的所有路线中 总路程/总时间 最大的路线,输出所求路线的总路程/总时间。
【数据说明】
30%的数据,n<=20
100%的数据,n<=100,p,t<=10000
数据允许二分,二分答案,由题意得,ans = l / t 所以说 l - t/ans 越接近0时越逼近正确值,这样题目转化成了二分答案加上每次用最长路验证。
传送门:codevs1183
给出n个点的有向图,每条边有两个参数(路程(len)和时间(time)),求从1号点出发到N号点的所有路线中 总路程/总时间 最大的路线,输出所求路线的总路程/总时间。
【数据说明】
30%的数据,n<=20
100%的数据,n<=100,p,t<=10000
数据允许二分,二分答案,由题意得,ans = l / t 所以说 l - t/ans 越接近0时越逼近正确值,这样题目转化成了二分答案加上每次用最长路验证。
[code]#include<iostream> #include<cstdio> #include<cstring> #include<deque> using namespace std; int n; double map_l[101][101]; double map_t[101][101]; double map[101][101]; const int size = 1001000; double dist[size]; bool use[size]; deque < int > q; int pos[size]; bool spfa() { for(int i = 1 ; i <= n ; i ++) dist[i] = -214748364 , pos[i] = 0 , use[i] = 0; while(!q.empty()) q.pop_back(); dist[1] = 0; use[1] = 1; q.push_back(1); while(!q.empty()) { int f = q.front(); q.pop_front(); use[f] = 0; for(int i = 1 ; i <= n ; i ++) { if(map_t[f][i] && dist[i] < dist[f] + map[f][i]) { dist[i] = dist[f] + map[f][i]; if(!use[i]) { use[i] = 1; if(!q.empty()) { if(dist[i] > dist[q.front()]) q.push_front(i); else if(i > q.front()) q.push_front(i); else q.push_back(i); } else q.push_back(i); pos[i] ++; if(pos[i] > n) return true; } } } } if(dist > 0) return true; return false; } bool check(double mid) { for(int i = 1 ; i <= n ; i ++) { for(int j = 1 ; j <= n ; j ++) map[i][j] = map_l[i][j] - mid * map_t[i][j]; } if(spfa()) return true; return false; } double EF(double l , double r) { while(r - l > 0.0001) { double mid = (l + r) / 2 ; if(check(mid)) l = mid; else r = mid; } return l; } int main() { scanf("%d",&n); for(int i = 1 ; i <= n ; i ++) for(int j = 1 ; j <= n ; j ++) scanf("%lf",&map_l[i][j]); for(int i = 1 ; i <= n ; i ++) for(int j = 1 ; j <= n ; j ++) scanf("%lf",&map_t[i][j]); double l = 0 , r = 100000; printf("%.3lf",EF(l,r)); return 0; }
传送门:codevs1183
相关文章推荐
- Redis阻塞队列原理学习
- linux curl 命令详解,以及实例
- 记录优秀博客
- servlet3.0
- 利用DisplayMetrics类获取Android设备屏幕分辨率
- 第四周实践项目6--多项式求和
- 在包内调用installer安装应用程序的方法
- C++ do...while(0) do...while(false)的妙用
- Java 任意长度byte数组转换为int数组
- 如何成为一名软件架构师
- 【work】输出日期为那一年的第几天
- [LeetCode]19. Unique Paths唯一路径
- 靶形数独
- 第十一周第二天
- MFC 列表,日历,及动画控件
- unity与java相互调用
- C++指针详解
- android开发之使用拼音搜索汉字
- android开发之使用拼音搜索汉字
- android开发之使用拼音搜索汉字