[APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案
题目链接:
枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益。
新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路,最短路用$floyd$求即可。
对于原图的边,边权为$0$,长度为输入长度。
对于新图,需要找到一个环使得换上边的边权和比长度和最大。
显然二分答案然后分数规划,之后就变成了判断图中是否有负环,用SPFA判负环即可。
注意此题卡精,需要使用$long\ double$。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ld long double
using namespace std;
const double eps=1e-10;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read() {int x=0,flag=1; char c=nc();if(c=='-'){flag=-1,c=nc();} while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return flag*x;}
int f[110][110];
int head[110];
int next[200000];
int to[200000];
int a[200000];
int b[200000];
ld v[200000];
int vis[110];
int cnt[110];
queue<int>que;
int s[110][1010];
int t[110][1010];
int tot;
int n,m,q;
int x,y,z;
ld ans;
ld dis[110];
void add(int x,int y,int w,int z)
{
next[++tot]=head[x];
head[x]=tot;
to[tot]=y;
a[tot]=w;
b[tot]=z;
}
bool SPFA(int S)
{
dis[S]=0;
que.push(S);
vis[S]=1;
while(!que.empty())
{
int now=que.front();
que.pop();
vis[now]=0;
for(int i=head[now];i;i=next[i])
{
if(dis[to[i]]>dis[now]+v[i])
{
dis[to[i]]=dis[now]+v[i];
cnt[to[i]]=cnt[now]+1;
if(cnt[to[i]]>150)
{
return true;
}
if(!vis[to[i]])
{
vis[to[i]]=1;
que.push(to[i]);
}
}
}
}
return false;
}
int main()
{
n=read();m=read();q=read();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=q;j++)
{
s[i][j]=read();t[i][j]=read();
}
}
memset(f,0x3f,sizeof(f));
for(int i=1;i<=m;i++)
{
x=read();y=read();z=read();
f[x][y]=min(f[x][y],z);
add(x,y,0,z);
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(f[i][j]==0x3f)continue;
int mx=-1;
for(int k=1;k<=q;k++)
{
int num;
if(s[i][k]==-1||t[j][k]==-1||s[i][k]>=t[j][k])continue;
else num=t[j][k]-s[i][k];
mx=max(mx,num);
}
if(mx==-1)continue;
add(i,j,mx,f[i][j]);
}
}
ld l=0,r=1e12;
ans=-1;
while(r-l>=eps)
{
ld mid=(l+r)/2;
for(int i=1;i<=tot;i++)
{
v[i]=mid*b[i]-a[i];
}
for(int i=1;i<=n;i++)
{
dis[i]=0;
vis[i]=cnt[i]=0;
}
int flag=0;
for(int i=1;i<=n;i++)
{
if(dis[i]==0)
{
if(SPFA(i))
{
l=mid;
ans=mid;
flag=1;
break;
}
}
}
if(!flag)
{
r=mid;
}
}
printf("%lld",ans==-1?0ll:(ll)(ans+eps));
}
[APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案的更多相关文章
- 【HNOI2009】最小圈 题解(SPFA判负环+二分答案)
前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄. --------------------- 题目链接 题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小 ...
- BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...
- [HNOI2009]最小圈 分数规划 spfa判负环
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
- [P1768]天路(分数规划+SPFA判负环)
题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...
- spfa判负环
bfs版spfa void spfa(){ queue<int> q; ;i<=n;i++) dis[i]=inf; q.push();dis[]=;vis[]=; while(!q ...
- POJ 3259 Wormholes(SPFA判负环)
题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...
- Poj 3259 Wormholes(spfa判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...
- poj 1364 King(线性差分约束+超级源点+spfa判负环)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14791 Accepted: 5226 Description ...
随机推荐
- springboot笔记02——快速入门quickstart
前言 学习一个新的框架,往往会用一个quickstart快速入门,这次就写一下springboot的quickstart程序. 开发环境 JDK 1.8 Springboot 2.1.6 Maven ...
- werkzeug/routing.py-Rule源码分析
Rule类主要用来定义和表示一个URL的模式.主要定义了一些关键字参数,用来改变url的行为.例如:这个url可以接收的请求方法,url的子域名,默认路径,端点名称,是否强制有斜杠在末尾等等 在最开始 ...
- JavaScript获取页面元素的常用方法
1.通过标签获取元素,返回一个数组 var li = document.getElementsByTagName('li');//标签获取元素 li[0].innerHTML;// 查看获取元素的内容 ...
- windows上安装python虚拟环境
一.windows上安装python虚拟环境 1.安装pip install virtualenvvirtualenv --version 2.新建一个python虚拟环境virtual_env_01 ...
- scrapy框架介绍
一,介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性 ...
- LVS工作原理及集群类型
Cluster概念 Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统 Linux Cluster类型: LB:Load Balancing,负载均衡 HA:High ...
- GPT分区格式
1. GPT定义 全局唯一标识分区表(GUID partition table, 缩写:GPT)是一个实体硬盘的分区表的结构布局的标准.它是可扩展固件接口(UEFI)标准的一部分,被用于替代BIOS系 ...
- 创建虚拟目录 http://localhost:1001/ 失败,错误: 无法创建网站
使用vs2015打开一个vs2008项目报错了. 最后网上找到的解决方案, 1,打开编辑xxx.csproj文件: 2,找到节点ProjectExtensions注释掉: 3,重新加载就好了.
- Nginx练习练习玩玩
Date:2019-11-9 读前思考: 对于NGINX,一般会问什么? 面试官会从哪方面入手? 面试官到底想考察什么? 你做好准备了吗? 如果对于初学者,往往可以通过面试题来提升对某一个技术的了解和 ...
- ECU 自动化生产测试系统
概述 ECU(Electronic Control Unit) 是现代车辆中最重要的部件之一,其稳定性.可靠性对车辆安全性的影响至关重要.如何保证ECU 生产质量和效率.如何在生产过程中对ECU 进行 ...