题目链接: (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转移,没实现过。估计不可行,即使是对的也太慢。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<algorithm>
#define llong long long
using namespace std;const int N = 100;
const int M = 10000;
const int P = 1000;
const llong INF = 2000000000ll;
struct AEdge
{int u,v; llong w;
} ae[M+3];
struct Edge
{int v,nxt; llong w;
} e[(M<<1)+3];
llong dist[N+3];
int que[N+3];
bool inq[N+3];
int tot[N+3];
bool vis[N+3];
int fe[N+3];
llong ai[N+3][P+3],ao[N+3][P+3];
llong mxv[N+3][N+3];
llong dis[N+3][N+3];
int n,m,p,en;void addedge(int u,int v,llong w)
{
//  printf("addedge %d %d %lld\n",u,v,w);en++; e[en].v = v; e[en].w = w;e[en].nxt = fe[u]; fe[u] = en;
}void clear()
{for(int i=1; i<=n; i++) fe[i] = 0,vis[i] = false;for(int i=1; i<=en; i++) {e[i].v = e[i].w = e[i].nxt = 0;}en = 0;
}bool spfa(int s)
{for(int i=1; i<=n; i++) dist[i] = -INF,tot[i] = 0,inq[i] = false;int head = 1,tail = 2; que[tail-1] = s; dist[s] = 0ll; inq[s] = true; tot[s] = 1; vis[s] = true;while(head!=tail){int u = que[head]; head++; if(head>n+1) head = 1;for(int i=fe[u]; i; i=e[i].nxt){int v = e[i].v;if(dist[v]<=dist[u]+e[i].w){dist[v] = dist[u]+e[i].w;vis[v] = true;if(!inq[v]){que[tail] = v; tail++; if(tail>n+1) tail = 1;inq[v] = true; tot[v]++;if(tot[v]>n) return true;}}}inq[u] = false;}return false;
}int main()
{scanf("%d%d%d",&n,&m,&p);for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dis[i][j] = INF;for(int i=1; i<=n; i++){for(int j=1; j<=p; j++){scanf("%lld%lld",&ai[i][j],&ao[i][j]);}}for(int i=1; i<=m; i++){scanf("%d%d%lld",&ae[i].u,&ae[i].v,&ae[i].w);dis[ae[i].u][ae[i].v] = ae[i].w;}for(int k=1; k<=n; k++){for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);}}}
//  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]);for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){mxv[i][j] = -INF;if(dis[i][j]){for(int k=1; k<=p; k++){if(ai[i][k]!=-1 && ao[j][k]!=-1) {mxv[i][j] = max(mxv[i][j],ao[j][k]-ai[i][k]);}}}
//          printf("mxv[%d][%d]=%lld\n",i,j,mxv[i][j]);}}llong left = 0ll,right = INF;while(left<right){llong mid = (left+right+1ll)>>1;
//      printf("left%lld right%lld mid%lld\n",left,right,mid);for(int i=1; i<=m; i++){addedge(ae[i].u,ae[i].v,-ae[i].w*mid);}for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(mxv[i][j]>-INF) {addedge(i,j,mxv[i][j]-mid*dis[i][j]);}}}bool ok = false;for(int i=1; i<=n; i++){if(!vis[i]) {bool cur = spfa(i); if(cur) {ok = true; break;}}}if(ok) {left = mid;}else {right = mid-1;}clear();}printf("%lld\n",left);return 0;
}

BZOJ 4898 Luogu P3778 [APIO2017]商旅 (分数规划、最短路)相关推荐

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

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

  2. bzoj 3232: 圈地游戏【分数规划+最小割】

    数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...

  3. c........x 4^8^2^6 ssl 2554 小澳的葫芦 01分数规划+最短路

    Description 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界有n个葫芦,标号为1~ n.n个葫芦由m条藤连接 ...

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

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

  5. BZOJ 4819 Luogu P3705 [SDOI2017]新生舞会 (最大费用最大流、二分、分数规划)

    现在怎么做的题都这么水了.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4819 (luogu) https://ww ...

  6. BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)

    毒瘤,毒瘤,毒瘤-- \(30000\)这个数据范围,看上去就是要搞事的啊... 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2402 ...

  7. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  8. bzoj 1690: [Usaco2007 Dec]奶牛的旅行(01分数规划--最优比率环)

    01分数规划问题: 给你n个物品,a[i]表示第i个物品的收益,b[i]表示代价,x[i]表示选或不选,求一个最佳方案使得下式取值最大 通用解: 当然是从式子上考虑,定义函数F[cnt]如下: 其中c ...

  9. 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 601  Solved: 313 Description 学 ...

最新文章

  1. python画函数曲线-python画蝴蝶曲线图的实例
  2. 全球主要城市经纬度api
  3. 启明云端基于sigmastarSSD201/202核心板\开发板资料分享地址,另外还可以加入技术沟通群聊,及时解决相关技术问题!
  4. ECMAScript 新提案:JSON模块
  5. loopback接口、router ID详解
  6. PyQt 5.4参考指南 ---- PyQt5和PyQt4之间的差异
  7. MVC Razor视图引擎控件
  8. Oracle XE http端口8080的修改
  9. asp.net 模板页中 控件 ID和Name 的变化
  10. Net设计模式实例之观察者模式(Observer Pattern)
  11. 11个程序员最常犯的MySQL错误(PHP开发)
  12. Python2安装说明
  13. 超全AD软件3D封装库 免费分享!
  14. PHP框架底层源码怎么看,php底层_php框架底层源码怎么看
  15. 致远oa系统unix 服务器,致远oa如何设置服务器地址
  16. Agarose bound-WFA,WFL;琼脂糖结合紫藤凝集素(WFA,WFL)
  17. TB6612FNG与直流电机控制教程
  18. 高级变量类型 ---- 字符串
  19. 计算机网络——BGP协议
  20. 1.IEC 62056-21 E模式通信

热门文章

  1. C语言1e12怎么识别,求大神帮助词法分析,当输入第一个1.2e12时可以输出,当时输入第二个1.2e12时就不能输出了,万分感谢,还有不能识别x=7*8+9中的+9,...
  2. mysql 表与表之间的条件比对_Mysql分库分表面试题(mysql高可用方案解析)
  3. [计算机视觉:算法与应用]学习笔记一:图像形成
  4. VC2010编译boost
  5. 如何将伪数组转换成数组
  6. grldr 和 grldr.mbr 区别
  7. bash-shell高级编程-变量的赋值
  8. 也谈SSDT Hook(一)
  9. 「 每日一练,快乐水题 」917. 仅仅反转字母
  10. spring security加载原理(基于springboot)