luogu P1768 天路 |01分数规划+负环
题目描述
言归正传,小X的梦中,他在西藏开了一家大型旅游公司,现在,他要为西藏的各个景点设计一组铁路线。但是,小X发现,来旅游的游客都很挑剔,他们乘火车在各个景点间游览,景点的趣味当然是不用说啦,关键是路上。试想,若是乘火车一圈转悠,却发现回到了游玩过的某个景点,花了一大堆钱却在路上看不到好的风景,那是有多么的恼火啊。
所以,小X为所有的路径定义了两个值,Vi和Pi,分别表示火车线路的风景趣味度和乘坐一次的价格。现在小X想知道,乘客从任意一个景点开始坐火车走过的一条回路上所有的V之和与P之和的比值的最大值。以便为顾客们推荐一条环绕旅游路线(路线不一定包含所有的景点,但是不可以存在重复的火车路线)。
于是,小X梦醒之后找到了你……
输入格式
第一行两个正整数N,M,表示有N个景点,M条火车路线,火车路线是单向的。
以下M行,每行4个正整数,分别表示一条路线的起点,终点,V值和P值。
注意,两个顶点间可能有多条轨道,但一次只能走其中的一条。
输出格式
一个实数,表示一条回路上最大的比值,保留1位小数。
若没有回路,输出-1。
说明/提示
对于30%的数据,1≤N≤100,1≤M≤20;
对于60%的数据,1≤N≤3,000,1≤M≤2,000;
对于100%的数据,1≤N≤7,000,1≤M≤20,000,1≤Vi,Pi≤1,000.
保证答案在200以内.
01分数规划+负环
ans>= \(\sum\)vi/pi
\(\sum\) ans*p1-vi>=0
把这个作为权值,然后找负环
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define db double
using namespace std;
const db eps=1e-2;
const int N=7e3+10,M=2e4+10,inf=1<<29;
int nxt[M],head[N],go[M],V[M],P[M],tot;
inline void add(int u,int v,int o1,int o2){
	nxt[++tot]=head[u];head[u]=tot;go[tot]=v;V[tot]=o1;P[tot]=o2;
}
db dis[N];
bool vis[N];
int used[N];
int s;
int n,m;
inline bool spfa(db ans,int now){
  	vis[now]=true;
    for(int i=head[now];i;i=nxt[i]){
        int v=go[i];
        db x=ans*P[i]-V[i];
        if(dis[v]>dis[now]+x){
            if(vis[v])return 0;
            else{
                dis[v]=dis[now]+x;
                vis[now]=1;
                if(!spfa(ans,v))return 0;
            }
        }
    }
    vis[now]=0;
    return 1;
}
inline bool check(db x){
	for(int i=1;i<=n;i++){
		dis[i]=inf;
		used[i]=0;
		vis[i]=0;
	}
	return !spfa(x,s);
}
int main(){
	cin>>n>>m;
	db l=0,r=3000,ans=-1;
	for(int i=1,u,v,o1,o2;i<=m;i++){
		scanf("%d%d%d%d",&u,&v,&o1,&o2);
		add(u,v,o1,o2);
	}
	s=n+1;
	for(int i=1;i<=n;i++)add(s,i,0,0);
	while(l+eps<r){
		db mid=(l+r)/2;
		if(check(mid)){
			l=mid;
			ans=mid;
		}else{
			r=mid;
		}
	}
	if(ans==-1)printf("-1\n");
	else
	printf("%.1f\n",ans);
}
												
											luogu P1768 天路 |01分数规划+负环的更多相关文章
- luogu 2115 破坏(01分数规划)
		
题意:给出一个序列,删除一个连续的子串后使得剩下的平均值最小. 典型的01分数规划,令f(x)=(sum1[i]+sum2[j])/(i+j).sum1表示前缀和,sum2表示后缀和,那么我们就相当于 ...
 - P3288-[SCOI2014]方伯伯运椰子【0/1分数规划,负环】
		
正题 题目链接:https://www.luogu.com.cn/problem/P3288 题目大意 给出\(n\)个点\(m\)条边的一张图,没条边\(i\)流量为\(c_i\),费用是\(d_i ...
 - POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]
		
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9703 Accepted: 3299 ...
 - bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]
		
3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...
 - bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环
		
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 594 Solved: 360[Submit][Statu ...
 - 【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)
		
题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除 ...
 - 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
		
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
 - [转]01分数规划算法  ACM 二分 Dinkelbach 最优比率生成树 最优比率环
		
01分数规划 前置技能 二分思想最短路算法一些数学脑细胞? 问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此 ...
 - 2018.09.12 poj3621Sightseeing Cows(01分数规划+spfa判环)
		
传送门 01分数规划板题啊. 发现就是一个最优比率环. 这个直接二分+spfa判负环就行了. 代码: #include<iostream> #include<cstdio> # ...
 
随机推荐
- Vue 项目添加单元测试发现的问题及解决
			
用 Jest 测试单文件组件 1.安装 Jest 和 Vue Test Utils npm install --save-dev jest @vue/test-utils 2.配置 package.j ...
 - Python文件打包exe教程——Pyinstaller(亲测有效)
			
今天将要解决一个问题,如何打包Pyhon文件 众所周知,Python文件的后缀名为“.py” 所以执行Python文件的要求之一便是具有python环境. 偶尔特殊情况,或者运行一些比较简单的工具,但 ...
 - pip的简单用法
			
pip的用法: 其实跟linux的yum很像,它可以帮我们安装python所需要的环境包,并且可以包解决依赖关系 eg: 列出已安装的包 pip list 安装要安装的包 pip install xx ...
 - windows中修改IP映射的位置
			
windows中修改IP映射的位置 置顶 2018年08月05日 14:42:44 wangxiaolong0 阅读数:1473 在安装linux之后,发现windows不能通过映射来访问linu ...
 - c#属性(Property)
			
属性(Property)是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Field).属性(Property)是 ...
 - go-micro+php+consul简单的微服实现
			
首先我们用go-micro构建一个服务.(关于go-micro的使用可以参照官方实例或者文档) //新建一个微服务 micro new --type "srv" user-srv ...
 - Linux下编写-makefile-详细教程(跟我一起写-Makefile-Markdown整理版)
			
目录 概述 关于程序的编译和链接 Makefile 介绍 Makefile的规则 一个演示例子 make是怎样工作的 makefile中使用变量 让make自己主动推导 另类风格的makefile 清 ...
 - Spark性能优化指南——基础篇(转)
			
[转]Spark性能优化指南——基础篇 http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&am ...
 - openresty(nginx)中使用lua脚本获取请求IP地址的代码
			
人狠话不多,直接上代码:------------------------------------------------------------------------------------- lo ...
 - Extjs导入Excel文件之后grid自动刷新显示刚插入的数据
			
var winUpload = new Ext.Window({ title: '导入excel文件', width: 400, height:200, listeners: { close: fun ...