首先floyd求出来每两点间的最短距离,然后再求出来从某点买再到某点卖的最大收益

问题就变成了找到一个和的比值最大的环

所以做分数规划,二分出来那个答案r,把边权变成w[i]-r*l[i],再做spfa判正环就行了

(本来想偷懒用floyd判正环,结果T了)

  1. #include<bits/stdc++.h>
  2. #define pa pair<int,int>
  3. #define CLR(a,x) memset(a,x,sizeof(a))
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn=,maxm=,maxk=;
  7. const ll inf=1e15;
  8.  
  9. inline ll rd(){
  10. ll x=;char c=getchar();int neg=;
  11. while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
  12. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  13. return x*neg;
  14. }
  15.  
  16. int w[maxn][maxn];
  17. int sell[maxn][maxk],buy[maxn][maxk];
  18. int N,M,K,cnt[maxn];
  19. ll dis[maxn][maxn],d[maxn][maxn],dd[maxn];
  20. bool inq[maxn];
  21. queue<int> q;
  22.  
  23. bool spfa(int s){
  24. while(!q.empty()) q.pop();
  25. dd[s]=;q.push(s);cnt[s]=;
  26. while(!q.empty()){
  27. int p=q.front();inq[p]=;
  28. // printf("%d %d %d\n",p,cnt[p],dd[p]);
  29. q.pop();
  30. for(int b=;b<=N;b++){
  31. if(d[p][b]==-inf) continue;
  32. if(dd[b]<=dd[p]+d[p][b]){
  33. dd[b]=dd[p]+d[p][b];
  34. if(inq[b]) continue;
  35. if(++cnt[b]>N) return ;
  36. q.push(b);
  37. inq[b]=;
  38. }
  39. }
  40. }return ;
  41. }
  42.  
  43. inline bool judge(ll r){
  44. // printf("%lld:\n",r);
  45. for(int i=;i<=N;i++){
  46. for(int j=;j<=N;j++)
  47. d[i][j]=(dis[i][j]==-)?-inf:w[i][j]-r*dis[i][j];
  48. }
  49. bool re=;
  50. CLR(cnt,);CLR(inq,);
  51. for(int i=;i<=N;i++) dd[i]=-inf;
  52. for(int i=;i<=N&&!re;i++){
  53. if(!cnt[i]) re|=spfa(i);
  54. }
  55. return re;
  56. }
  57.  
  58. int main(){
  59. //freopen("","r",stdin);
  60. int i,j,k;
  61. N=rd(),M=rd(),K=rd();
  62. for(i=;i<=N;i++){
  63. for(j=;j<=K;j++){
  64. buy[i][j]=rd(),sell[i][j]=rd();
  65. }
  66. }
  67. for(i=;i<=N;i++){
  68. for(j=;j<=N;j++){
  69. if(i==j) continue;
  70. for(k=;k<=K;k++){
  71. if(sell[j][k]==-||buy[i][k]==-) continue;
  72. w[i][j]=max(w[i][j],sell[j][k]-buy[i][k]);
  73. }
  74. }
  75. }
  76. CLR(dis,-);
  77. for(i=;i<=M;i++){
  78. int a=rd(),b=rd(),c=rd();
  79. dis[a][b]=c;
  80. }
  81. for(i=;i<=N;i++){
  82. for(j=;j<=N;j++){
  83. if(dis[j][i]==-) continue;
  84. for(k=;k<=N;k++){
  85. if(dis[i][k]==-) continue;
  86. if(dis[j][k]==-||dis[j][k]>dis[j][i]+dis[i][k])
  87. dis[j][k]=dis[j][i]+dis[i][k];
  88. }
  89. }
  90. }
  91. // for(i=1;i<=N;i++) for(j=1;j<=N;j++) printf("%d-%d,%lld,%lld\n",i,j,dis[i][j],w[i][j]);
  92.  
  93. ll l=,r=inf,ans=;
  94. while(l<=r){
  95. int m=l+r>>;
  96. if(judge(m)) ans=m,l=m+;
  97. else r=m-;
  98. }
  99. printf("%lld\n",ans);
  100. return ;
  101. }

luogu3778/bzoj4898 商旅 (floyd+分数规划+spfa)的更多相关文章

  1. 【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa

    题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走 ...

  2. [APIO2017]商旅(floyd+分数规划+SPFA)

    题解:首先肯定要跑最短路,而n<=100,所以可以用floyd,然后根据比值,很容易想到二分答案,然后再SPFA跑一遍负环,就能求出解了. #include<bits/stdc++.h&g ...

  3. 2018.09.09 poj2949Word Rings(01分数规划+spfa判环)

    传送门 这题要先巧妙的转化一下. 对于每个字符串,我们把头尾的两个小字符串对应的点连边,边权是这个字符串的长度. 这样最多会出现26*26个点. 这个时候就只用求出边权和跟边数的最大比值了. 这个显然 ...

  4. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

  5. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  6. 【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,然后再判 ...

  7. 【bzoj1690】[Usaco2007 Dec]奶牛的旅行 分数规划+Spfa

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

  8. [HNOI2009]最小圈 分数规划 spfa判负环

    [HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...

  9. bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】

    其实并不会分数规划 因为要最大化 ans=总收益/总路程 ,所以考虑二分答案,找到一条 ans<=总收益/总路程 的回路.先预处理出d(i,j)为(i,j)最短路,w(i,j)为在i买某个物品在 ...

随机推荐

  1. MariaDB数据库性能优化

    1. 硬件优化 1.1 内存(Memory) 内存是最重要的因素,因为它允许您调整服务器系统变量.更多的内存意味着可以将更大的密钥和表缓存存储在内存中,从而减少磁盘访问速度,降低一个数量级. 如果未将 ...

  2. 2017-2018-1 20155331 嵌入式C语言

    2017-2018-1 20155331 嵌入式C语言 作业要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零) ...

  3. Exp8 web基础

    20155332<网络对抗>Exp5 MSF基础应用 1.实验环境搭建 1.apache的安装与配置 安装:sudo apt-get install apache2 开启:service ...

  4. html元素双击事件触发机制猜想及疑惑

    今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...

  5. Js_图片轮播

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  7. 华为云对Kubernetes在Serverless Container产品落地中的实践经验

    华为云容器实例服务,它基于 Kubernetes 打造,对最终用户直接提供 K8S 的 API.正如前面所说,它最大的优点是用户可以围绕 K8S 直接定义运行应用. 这里值得一提是,我们采用了全物理机 ...

  8. python 游戏(龙的国度)

    1. 理清楚游戏思路 实现功能:2个洞穴选择,一个洞穴是好龙,一个洞穴是坏龙,坏龙可以概率屠龙或者概率逃跑选项(后续难度需要增加宝藏获取装备,随机遇见商人,随着游戏进度逐步减少屠龙概率) 2. 计数和 ...

  9. PBFT_拜占庭容错算法

    根据论文<Practical Byzantine Fault Tolerance and Proactive Recovery>整理 Practical byzantine fault t ...

  10. Selenium--数据驱动(python)

    前言: 什么是数据驱动? 从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.说人话,其实就是参数化. 本次介绍2种文件驱动:ini文件和yaml文件 一.ini文件 1 ...