codevs 1183 泥泞的道路 01分数规划
CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连。因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同。小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度。
现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线。请你告诉他这个值。
第一行包含一个整数n,为小区数。
接下来n*n的矩阵P,其中第i行第j个数表示从小区i到小区j的道路长度为Pi,j。第i行第i个数的元素为0,其余保证为正整数。
接下来n*n的矩阵T,第i行第j个数表示从小区i到小区j需要的时间Ti,j。第i行第i个数的元素为0,其余保证为正整数。
写入一个实数S,为小区1到达n的最大答案,S精确到小数点后3位。
3
0 8 7
9 0 10
5 7 0
0 7 6
6 0 6
6 2 0
2.125
sigma(dis)/sigma(time) = x, dis-x*time = 0。
构造图f[i][j] = dis[i][j]-mid*time[i][j], 不断二分mid逼近答案。
01分数规划感觉我还是不太理解啊=.=
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
double dis[], f[][], g[][], t[][], num[], vis[];
int n;
int spfa() {
for(int i = ; i<=n; i++)
dis[i] = -inf;
dis[] = ;
mem(vis);
mem(num);
vis[] = ;
queue <int> q;
q.push();
while(!q.empty()) {
int u = q.front(); q.pop();
vis[u] = ;
num[u]++;
if(num[u]>n)
return ;
for(int i = ; i<=n; i++) {
if(f[u][i]!=) {
if(dis[i]<dis[u]+f[u][i]) {
dis[i] = dis[u]+f[u][i];
if(!vis[i]) {
q.push(i);
vis[i] = ;
}
}
}
}
}
if(dis[n]>)
return ;
return ;
}
int check(double mid) {
for(int i = ; i<=n; i++) {
for(int j = ; j<=n; j++) {
f[i][j] = g[i][j]-mid*t[i][j];
}
}
if(spfa())
return ;
return ;
}
int main()
{
cin>>n;
for(int i = ; i<=n; i++) {
for(int j = ; j<=n; j++) {
scanf("%lf", &g[i][j]);
}
}
for(int i = ; i<=n; i++) {
for(int j = ; j<=n; j++) {
scanf("%lf", &t[i][j]);
}
}
double l = , r = inf;
while(fabs(r-l)>eps) {
double mid = (l+r)/;
if(check(mid))
l = mid;
else
r = mid;
}
printf("%.3f\n", l);
return ;
}
codevs 1183 泥泞的道路 01分数规划的更多相关文章
- codevs1183 泥泞的道路(01分数规划)
1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description CS有n个小区,并且任意小区之间都有两 ...
- Codevs 1183 泥泞的道路
1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路 ...
- [codevs 1183][泥泞的道路(二分+spfa)
题目:http://dev.codevs.cn/problem/1183/ 分析:这个和最优比率生成树很像,都可以二分答案的,只不过判定方面一个是求是否有最短路径,一个是求是否有生成树.假设等待判定的 ...
- codevs 1183 泥泞的道路 (二分+SPFA+差分约束)
/* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简 ...
- 【Earthquake, 2001 Open 】 0-1 分数规划
71 奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛 ...
- BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】
题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...
- POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9703 Accepted: 3299 ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)
[题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...
随机推荐
- httpclient response 重定向
HTTPClient请求后,重定向后,获取重定向的URL. 方法一:重定向后获取URL import org.apache.http.HttpEntity; import org.apache.htt ...
- bootstrap-js(4)标签页
实例 标签页(Tab)在 Bootstrap 导航元素 一章中介绍过.通过结合一些 data 属性,您可以轻松地创建一个标签页界面. 通过这个插件您可以把内容放置在标签页或者是胶囊式标签页甚至是下拉菜 ...
- Struts2配置问题java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
方法一:右键点击项目--->build path-->configure build path-->左侧菜单栏就会看到Deployment Assembly-->右侧点击add ...
- poj 2771 最大独立集
这道题又无耻的抄袭了别人的代码. 刚开始以为是最大匹配,把条件不相符的人连一起,然后求最大匹配,感觉麻烦,然后看了别人的解题报告,是把相符的人连一起,然后减去,其实就是最大独立集. 最大独立集=|G| ...
- 学习使用GitHub(一)--之入门
因为经常Windows和linux系统交替的使用,在实验室一台电脑,在家一台电脑,自己的电脑和实验室的电脑上面的代码往往没法同步,以前由于种种原因(其实就是懒,没有学习GitHub这样的代码管理工具) ...
- python dict traversal
rs=dict() rs['item1'] = 'item1' rs['item2'] = 'item2' for k,d in rs.items(): print k,d for k in rs.k ...
- Linux网络管理——linux网络配置
2. linux网络配置 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- jitpack让使用第三方依赖库更简单
在开发过程中,使用第三方优秀依赖库是个很常见的问题,有的时候是maven,或者gradle, 或者sbt,大部分库工程,都会有对应的gradle,maven依赖代码,但是有的没有,尤其是使用的snap ...
- phpStrom添加插件:php文档生成(phpDocumentor)
1. 依次打开:Files => Settings => External Tools => +(add) 2. 填写信息:name:phpDoc; group:PHP插件; des ...
- python退格、方向键无法正常使用解决方法
CentOS 6.5 自带的Python 2.6.6 箭头以及退格键(Backspace)可正常使用: 自定义所安装的Python 2.7.6却发现箭头以及退格键(Backspace)在使用的时候出现 ...