【BZOJ4898】[Apio2017]商旅 分数规划+SPFA
【BZOJ4898】[Apio2017]商旅
Description
Input
Output
Sample Input
10 9 5 2
6 4 20 15
9 7 10 9
-1 -1 16 11
1 2 3
2 3 3
1 4 1
4 3 1
3 1 1
Sample Output
在样例中,我们考虑下面两条环路,“1 - 2 - 3 - 1” 和 “1 - 4 - 3 - 1”。
考虑环路 “1 - 2 - 3 - 1” :这条环路消耗的总时间是 分钟。在这条环路中,最佳的交易方式是:在编号为 1 的集市中购买编号为 2 的商品(花费的金钱为 5 );在编号为 2 的集市中卖出编号为 2 的商品(得到的金钱为 15 ),然后立即购买编号为 1 的商品(花费的金钱为 6 );带着编号为 1 的商品经过编号为 3 的集市,在回到编号为 1 的城市后卖出(得到的金钱为 9 )。在这个环路中,总盈利为13。 这个环路的盈利效率为13/7 ,向下取整后为 1 。
考虑环路 “1 - 4 - 3 - 1” :这条环路消耗的总时间是 分钟。在这条环路中,最佳的交易方式是:在编号为 1 的集市中购买编号为 2 的商品(花费的金钱为 5 );在编号为 4 的集市中卖出编号为 2 的商品(得到的金钱为 11 );然后经过编号为 3 的集市回到编号为 1 的城市。在这个环路中,总盈利为 6。 这个环路的盈利效率为6/3 ,向下取整后为 2 。
综上所述,盈利效率最高的环路的盈利效率为 2 。
题解:考场上最简单的题,嗯,当我把正解想出来时,距离考试结束还有不到20分钟~
先预处理出任意两个点之间的最短路径以及最优购买策略。那么二分答案mid,从i到j连(收益-长度*mid)的边,(如果i能到j的话),然后用SPFA判正环即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
int n,m,K,cnt;
int S[110][1010],B[110][1010],to[20010],next[20010],head[110],inq[110],len[110];
double val[20010],dis[110];
int map[110][110],td[110][110];
queue<int> q;
inline void add(int a,int b,double c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
bool check(double x)
{
int i,j,u;
memset(head,-1,sizeof(head)),memset(dis,0,sizeof(dis)),cnt=0;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j&&td[i][j]>=0) add(i,j,td[i][j]-x*map[i][j]);
for(i=1;i<=n;i++) q.push(i),inq[i]=len[i]=1;
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i]) if(dis[to[i]]<dis[u]+val[i])
{
dis[to[i]]=dis[u]+val[i],len[to[i]]=len[u]+1;
if(len[to[i]]>n) return 1;
if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
}
}
return 0;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),K=rd();
int i,j,k,a,b,c;
memset(map,0x3f,sizeof(map)),memset(td,0xc0,sizeof(td));
for(i=1;i<=n;i++)
{
map[i][i]=0;
for(j=1;j<=K;j++) B[i][j]=rd(),S[i][j]=rd();
}
for(i=1;i<=m;i++) a=rd(),b=rd(),c=rd(),map[a][b]=min(map[a][b],c);
for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
double l=0,r=0,mid;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j&&map[i][j]<0x3f3f3f3f)
{
td[i][j]=0;
for(k=1;k<=K;k++) if(B[i][k]!=-1&&S[j][k]!=-1&&B[i][k]<S[j][k]) td[i][j]=max(td[i][j],S[j][k]-B[i][k]);
r=(r>td[i][j])?r:td[i][j];
}
for(i=1;i<=30;i++)
{
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%d",int(floor(l+1e-9)));
return 0;
}
【BZOJ4898】[Apio2017]商旅 分数规划+SPFA的更多相关文章
- BZOJ 4898 Luogu P3778 [APIO2017]商旅 (分数规划、最短路)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4898 (luogu)https://www.luogu.org/probl ...
- 【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa
题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走 ...
- 2018.09.09 poj2949Word Rings(01分数规划+spfa判环)
传送门 这题要先巧妙的转化一下. 对于每个字符串,我们把头尾的两个小字符串对应的点连边,边权是这个字符串的长度. 这样最多会出现26*26个点. 这个时候就只用求出边权和跟边数的最大比值了. 这个显然 ...
- Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...
- [BZOJ4898] [Apio2017]商旅
[BZOJ4898] [Apio2017]商旅 传送门 试题分析 考虑两个点之间的路径,显然如果交易的话肯定选\(S_{t,i}-B_{s,i}\)最大的. 那么我们可以先用\(Cost\)把两个点的 ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- 【bzoj1486】[HNOI2009]最小圈 分数规划+Spfa
题目描述 样例输入 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 样例输出 3.66666667 题解 分数规划+Spfa判负环 二分答案mid,并将所有边权减去mid,然后再判 ...
- 【bzoj1690】[Usaco2007 Dec]奶牛的旅行 分数规划+Spfa
题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标 ...
- [HNOI2009]最小圈 分数规划 spfa判负环
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...
随机推荐
- 表单提交时上传图片 表单ajax提交
页面 <script type="text/javascript" src="js/jquery.form.js"></script>& ...
- arm-linux-gdb+gdbserver环境搭建以及远程调试
0) gdb源码下载:http://ftp.gnu.org/gnu/gdb/ 1) 编译arm-linux-gdb 指定交叉编译工具链的位置 export PATH=$PATH:/usr/local/ ...
- Windows利用命令行快速清除以及建立密码
我们Win10一般是没有管理员权限的!这就要求我们获取管理员权限了,一般有两种方法获取,我就介绍下面一种最简单的 老操作:WIn+R打开本窗口,输入:taskmgr 建立密码(administrato ...
- Python学习笔记(三)多线程的使用
这节记录学习多线程的心得. Python提供了thread模块,不过该模块的缺点很多,例如无法方便的等待线程结束,所以我们使用更加高级的threading模块. threading模块的使用一 ...
- JavaEE应用程序
一直想写一些关于JavaEE的东西,从刚開始看<Ejb in Action>的时候就想写,总是感觉自己知道的太少了.太不值得一提了.太欠缺了(我太谦虚了)--哈哈哈.到后来工作中一直在使用 ...
- OpenStack-Heat中的AWS::WaitCondition的使用
在heat中.一个instance的创建成功信号是在这个instance状态成为active之后发出的,这时候user-data可能还没有运行.可是heat已经觉得这个resource创建成功了,開始 ...
- C++ 内存泄漏
1. 内存泄漏: 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况. 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前 ...
- 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中
从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...
- Emmet:HTML/CSS编写插件
http://www.iteye.com/news/27580 用法: http://docs.emmet.io/cheat-sheet/ sublime 2 添加:1. Ctrl+Alt+p -&g ...
- iOS swift中比较模型数组是否相等
在oc中,如果要比较模型数组中的元素是否相等一般重新isEqual方法即可 -(BOOL)isEqual:(id)object{ if (self == object) { return YES; } ...