题目链接:

[APIO2017]商旅

枚举任意两个点$(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));
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10858222.html

[APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案相关推荐

  1. dfs版SPFA判负环

    例题 Description 泡泡鱼是一条调皮的鱼,ta的家住在一片珊瑚礁上.在ta的眼里,这些珊瑚礁的形态可以脑补成一个n个节点,m条边的带权图,在海水的腐蚀下,这些珊瑚礁形成了许多的环,ta想考考 ...

  2. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  3. POJ 3259 Wormholes SPFA判负环

    思路:SPFA判负环 数组不要开太小-- (后面附一组测试数组) // by SiriusRen #include <queue> #include <cstdio> #inc ...

  4. 天路(01规划+SPFA判负环)

    传送门 公式图片来自洛谷题解 因为求V之和与P之和的比值的最大值.这个值不超过200 考虑到二分答案,设ans为最大值,则有 可以看出是01分数规划 那么每次就重新分配边的权值: ans*ci-vi ...

  5. 【2019icpc南京站网络赛 - H】Holy Grail(最短路,spfa判负环)

    题干: As the current heir of a wizarding family with a long history,unfortunately, you find yourself f ...

  6. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详(并不)解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多 ...

  7. bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

  8. poj3259 Wormholes(spfa判负环)

    题意:给m条路(S,E,T)代表点S.E之间双向边权重为T,紧接着给W个虫洞(S,E,T)代表S到E的有向边可以回到T秒前即权重为-T,问能不能通过虫洞看到看到初始的自己,即能不能回到初始点所在的时间 ...

  9. 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}Σgi​Σfi​​的最大值,这种问题称为01分数规 ...

最新文章

  1. 中国电子信息产业发展研究院主办的2018中国软件大会上大快搜索“又双叒叕”获奖了...
  2. Android之linux基础教学之八 内核同步介绍
  3. python linux命令-Python之路【第三篇】:Linux常用命令
  4. console用法java_使用console对javaScirpt进行全面调试-全面分析console用法
  5. C++(四)——类和对象(下)
  6. 发布在IIS的网站,可以用本机IP登录访问,用localhost不可登录访问
  7. 漫谈强化学习中的引导搜索策略
  8. 4.Hadoop的学习(Hadoop的安装及环境变量的配置)
  9. ElasticSearch重启策略
  10. endnote 参考文献加序号_Endnote教程|页码缩写
  11. 牛客题霸 车站建造问题 C++题解/答案
  12. python爬虫慕课网利用xpath_python爬虫实践——零基础快速入门(二)爬取豆瓣电影...
  13. python制作安装包_如何制作python安装模块(setup.py)
  14. 锐捷长ping_【交换机】S8606--s5750E互连接口ping大包(length=18024)会丢包
  15. HDU 4568 Hunter
  16. 计算机知识怎么记牢,怎么快速学拼音打字-教孩子学拼音的3个好方法:手脑结合、增加锚点、有趣的知识才能记得牢...
  17. Java上帝类(Object类)源码总结(1)
  18. 图像处理技术-基本运算
  19. TOP 5大数据工具,掌握1个你就是专家
  20. Latex 跨页图片跑到最后一页问题

热门文章

  1. js自定义对象 (转)
  2. python之路 day5
  3. 精悍的Python代码段-转
  4. vs2017 EFCore 迁移数据库命令
  5. 数据结构-队列和栈的那些事(三)
  6. 查看Oracle的redo日志切换频率
  7. 第二百零一天 how can I坚持
  8. 《python基础教程》笔记之 列表
  9. 纯js分页代码(简洁实用)
  10. 'GO' 附近有语法错误问题,我真是无语~