题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4898

(luogu)https://www.luogu.org/problemnew/show/P3778

题解: 先Floyd求任意两点最短路。

二分答案\(mid\)之后把边权乘以\(mid\)判断是否有大于\(0\)的即可。

\(O(n^2)\)枚举每一对点,然后如果能实现从\(i\)点买入\(j\)点卖出,那么从\(i\)向\(j\)连边代价为利润减(最短路乘以\(mid\))。

然后直接在原图上SPFA判正环即可。

时间复杂度\(O(ShortestPath(n,m+n^2)+n^3+n^2k)\)

自己还想到另一种做法就是设\(dp[i][j]\)为在\(i\)点持物品为\(j\)的最大利润然后SPFA转移,没实现过。估计不可行,即使是对的也太慢。

代码

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<cassert>
  5. #include<algorithm>
  6. #define llong long long
  7. using namespace std;
  8. const int N = 100;
  9. const int M = 10000;
  10. const int P = 1000;
  11. const llong INF = 2000000000ll;
  12. struct AEdge
  13. {
  14. int u,v; llong w;
  15. } ae[M+3];
  16. struct Edge
  17. {
  18. int v,nxt; llong w;
  19. } e[(M<<1)+3];
  20. llong dist[N+3];
  21. int que[N+3];
  22. bool inq[N+3];
  23. int tot[N+3];
  24. bool vis[N+3];
  25. int fe[N+3];
  26. llong ai[N+3][P+3],ao[N+3][P+3];
  27. llong mxv[N+3][N+3];
  28. llong dis[N+3][N+3];
  29. int n,m,p,en;
  30. void addedge(int u,int v,llong w)
  31. {
  32. // printf("addedge %d %d %lld\n",u,v,w);
  33. en++; e[en].v = v; e[en].w = w;
  34. e[en].nxt = fe[u]; fe[u] = en;
  35. }
  36. void clear()
  37. {
  38. for(int i=1; i<=n; i++) fe[i] = 0,vis[i] = false;
  39. for(int i=1; i<=en; i++) {e[i].v = e[i].w = e[i].nxt = 0;}
  40. en = 0;
  41. }
  42. bool spfa(int s)
  43. {
  44. for(int i=1; i<=n; i++) dist[i] = -INF,tot[i] = 0,inq[i] = false;
  45. int head = 1,tail = 2; que[tail-1] = s; dist[s] = 0ll; inq[s] = true; tot[s] = 1; vis[s] = true;
  46. while(head!=tail)
  47. {
  48. int u = que[head]; head++; if(head>n+1) head = 1;
  49. for(int i=fe[u]; i; i=e[i].nxt)
  50. {
  51. int v = e[i].v;
  52. if(dist[v]<=dist[u]+e[i].w)
  53. {
  54. dist[v] = dist[u]+e[i].w;
  55. vis[v] = true;
  56. if(!inq[v])
  57. {
  58. que[tail] = v; tail++; if(tail>n+1) tail = 1;
  59. inq[v] = true; tot[v]++;
  60. if(tot[v]>n) return true;
  61. }
  62. }
  63. }
  64. inq[u] = false;
  65. }
  66. return false;
  67. }
  68. int main()
  69. {
  70. scanf("%d%d%d",&n,&m,&p);
  71. for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dis[i][j] = INF;
  72. for(int i=1; i<=n; i++)
  73. {
  74. for(int j=1; j<=p; j++)
  75. {
  76. scanf("%lld%lld",&ai[i][j],&ao[i][j]);
  77. }
  78. }
  79. for(int i=1; i<=m; i++)
  80. {
  81. scanf("%d%d%lld",&ae[i].u,&ae[i].v,&ae[i].w);
  82. dis[ae[i].u][ae[i].v] = ae[i].w;
  83. }
  84. for(int k=1; k<=n; k++)
  85. {
  86. for(int i=1; i<=n; i++)
  87. {
  88. for(int j=1; j<=n; j++)
  89. {
  90. dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
  91. }
  92. }
  93. }
  94. // for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) printf("dis[%d][%d]=%lld\n",i,j,dis[i][j]);
  95. for(int i=1; i<=n; i++)
  96. {
  97. for(int j=1; j<=n; j++)
  98. {
  99. mxv[i][j] = -INF;
  100. if(dis[i][j])
  101. {
  102. for(int k=1; k<=p; k++)
  103. {
  104. if(ai[i][k]!=-1 && ao[j][k]!=-1) {mxv[i][j] = max(mxv[i][j],ao[j][k]-ai[i][k]);}
  105. }
  106. }
  107. // printf("mxv[%d][%d]=%lld\n",i,j,mxv[i][j]);
  108. }
  109. }
  110. llong left = 0ll,right = INF;
  111. while(left<right)
  112. {
  113. llong mid = (left+right+1ll)>>1;
  114. // printf("left%lld right%lld mid%lld\n",left,right,mid);
  115. for(int i=1; i<=m; i++)
  116. {
  117. addedge(ae[i].u,ae[i].v,-ae[i].w*mid);
  118. }
  119. for(int i=1; i<=n; i++)
  120. {
  121. for(int j=1; j<=n; j++)
  122. {
  123. if(mxv[i][j]>-INF) {addedge(i,j,mxv[i][j]-mid*dis[i][j]);}
  124. }
  125. }
  126. bool ok = false;
  127. for(int i=1; i<=n; i++)
  128. {
  129. if(!vis[i]) {bool cur = spfa(i); if(cur) {ok = true; break;}}
  130. }
  131. if(ok) {left = mid;}
  132. else {right = mid-1;}
  133. clear();
  134. }
  135. printf("%lld\n",left);
  136. return 0;
  137. }

BZOJ 4898 Luogu P3778 [APIO2017]商旅 (分数规划、最短路)的更多相关文章

  1. 【BZOJ4898】[Apio2017]商旅 分数规划+SPFA

    [BZOJ4898][Apio2017]商旅 Description 在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴.你被这个城市发达而美丽的市场所深深吸引,决定定居于此,做一个 ...

  2. 洛谷P3778 [APIO2017]商旅——01分数规划

    题目:https://www.luogu.org/problemnew/show/P3778 转化有点技巧: 其实直接关注比率的上下两项,也就是盈利和时间: 通过暴枚和 floyd 可以处理出两两点间 ...

  3. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  4. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  5. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  6. BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 79  Solved: 58[Sub ...

  7. luogu 2115 破坏(01分数规划)

    题意:给出一个序列,删除一个连续的子串后使得剩下的平均值最小. 典型的01分数规划,令f(x)=(sum1[i]+sum2[j])/(i+j).sum1表示前缀和,sum2表示后缀和,那么我们就相当于 ...

  8. bzoj 3232: 圈地游戏 01分数规划

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...

  9. BZOJ 4753 [Jsoi2016]最佳团体 ——01分数规划 树形DP

    要求比值最大,当然用分数规划. 二分答案,转化为选取一个最大的联通块使得它们的和大于0 然后我们直接DP. 复杂度$O(n^2\log {n})$ #include <map> #incl ...

随机推荐

  1. 记笔记的软件(vnote)

    前面我们已经把我们的 Ubuntu 系统在物理机上运行起来了,也做了一些简单的优化,教了大家怎么使用 Ubuntu 系统自带的应用商店和 apt 安装和卸载软件.接着我们安装了搜狗输入法,现在我们的系 ...

  2. python经典小程序集锦(一) 实现九九乘法表

    本篇文章主要是收集整理一些小程序以供大家娱乐,或者是在面试的时候使用到.文章会持续更新,希望大家收藏关注哦. 1.代码实现过程 for i in range(1, 10): for j in rang ...

  3. SMTP实现发送邮箱2(封装版)

    SMTP.h #ifndef __SMTP_H__ //避免重复包含 #define __SMTP_H__ #include <iostream> #include <list> ...

  4. YoloV3 训练崩溃

    经过排查  发现是这里出了问题 然后发现是标注文件里有 x=0 y=0  这样的数据,46_Jockey_Jockey_46_576.txt ,  那么肯定是标注文件出了问题!! 删除该标注文件即可. ...

  5. 记录一次SourceTree无法push问题排查及解决

    1.push代码卡住,一直转圈2.试了下拉取代码也拉不到3.试了使用git命令行push可以4.使用Sourcetree新建项目,一直在检查url.5.初步判断原因,SourceTree无法联网.6. ...

  6. C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即“内存”(memory)的意思.该函数的原型为: # ...

  7. 浅谈nginx简介和应用场景

    简介 nginx是一款轻量级的web服务器,它是由俄罗斯的程序设计师伊戈尔·西索夫所开发. nginx相比于Tomcat性能十分优秀,能够支撑5w的并发连接(而Tomcat只能支撑200-400),并 ...

  8. swagger2注解使用方法

    swagger注解整体说明: @Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界 ...

  9. [Abp vNext微服务实践] - vue-element-admin登录二

    简介: Vue Element Admin是基于vue.element ui开发的后台管理ui,abp vNext是abp新一代微服务框架.本篇将会介绍如何改造Vue Element Admin权限验 ...

  10. Appium Desired Capabilities-General Capabilities

    Desired Capabilities are keys and values encoded in a JSON object, sent by Appium clients to the ser ...