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

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

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

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

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=,maxm=,maxk=;
const ll inf=1e15; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int w[maxn][maxn];
int sell[maxn][maxk],buy[maxn][maxk];
int N,M,K,cnt[maxn];
ll dis[maxn][maxn],d[maxn][maxn],dd[maxn];
bool inq[maxn];
queue<int> q; bool spfa(int s){
while(!q.empty()) q.pop();
dd[s]=;q.push(s);cnt[s]=;
while(!q.empty()){
int p=q.front();inq[p]=;
// printf("%d %d %d\n",p,cnt[p],dd[p]);
q.pop();
for(int b=;b<=N;b++){
if(d[p][b]==-inf) continue;
if(dd[b]<=dd[p]+d[p][b]){
dd[b]=dd[p]+d[p][b];
if(inq[b]) continue;
if(++cnt[b]>N) return ;
q.push(b);
inq[b]=;
}
}
}return ;
} inline bool judge(ll r){
// printf("%lld:\n",r);
for(int i=;i<=N;i++){
for(int j=;j<=N;j++)
d[i][j]=(dis[i][j]==-)?-inf:w[i][j]-r*dis[i][j];
}
bool re=;
CLR(cnt,);CLR(inq,);
for(int i=;i<=N;i++) dd[i]=-inf;
for(int i=;i<=N&&!re;i++){
if(!cnt[i]) re|=spfa(i);
}
return re;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd(),K=rd();
for(i=;i<=N;i++){
for(j=;j<=K;j++){
buy[i][j]=rd(),sell[i][j]=rd();
}
}
for(i=;i<=N;i++){
for(j=;j<=N;j++){
if(i==j) continue;
for(k=;k<=K;k++){
if(sell[j][k]==-||buy[i][k]==-) continue;
w[i][j]=max(w[i][j],sell[j][k]-buy[i][k]);
}
}
}
CLR(dis,-);
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
dis[a][b]=c;
}
for(i=;i<=N;i++){
for(j=;j<=N;j++){
if(dis[j][i]==-) continue;
for(k=;k<=N;k++){
if(dis[i][k]==-) continue;
if(dis[j][k]==-||dis[j][k]>dis[j][i]+dis[i][k])
dis[j][k]=dis[j][i]+dis[i][k];
}
}
}
// 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]); ll l=,r=inf,ans=;
while(l<=r){
int m=l+r>>;
if(judge(m)) ans=m,l=m+;
else r=m-;
}
printf("%lld\n",ans);
return ;
}

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. android so壳入口浅析

    本文转自http://www.9hao.info/pages/2014/08/android-soke-ru-kou-q 前言   开年来开始接触一些加固样本,基本都对了so进行了处理,拖入ida一看 ...

  2. Qt FFMPEG+OpenCV开启摄像头

    //ffmpegDecode.h #ifndef __FFMPEG_DECODE_H__ #define __FFMPEG_DECODE_H__ #include "global.h&quo ...

  3. [BZOJ2138]stone[霍尔定理+线段树]

    题意 一共有 \(n\) 堆石子,每堆石子有一个数量 \(a\) ,你要进行 \(m\) 次操作,每次操作你可以在满足前 \(i-1\) 次操作的回答的基础上选择在 \([L_i,R_i]\) 区间中 ...

  4. python编码你需要知道的编码风格

    此时你已经可以写一些更长更复杂的 Python 程序,是时候讨论一下 编码风格 了.大多数语言可以写(或者更明白的说, 格式化 )作几种不同的风格.有些比其它的更好读.让你的代码对别人更易读是个好想法 ...

  5. 基于spring的redisTemplate的缓存工具类

    pom.xml文件添加 <!-- config redis data and client jar --><dependency> <groupId>org.spr ...

  6. jmeter实战1

  7. GitHub 新手教程 六,Git GUI 新手教程(3),从GitHub远端同步代码库

    从GitHub把代码库下载到本地: 1,打开 GitGUI,单击我们之前克隆好的本地库: 2,按图片所示点击,同步远端代码: 3,出现如下提示后,点击“Close”: 4,上面只是把代码下载下来,还没 ...

  8. Jenkins+Maven+SVN+Nexus自动化部署代码实例

    本文接着上篇安装jenkins,安装相关插件,使用我们公司持续集成的测试环境实例进行演示 ========= 完美的分割线 ========== 1.安装jenkins的maven插件 如果要使用je ...

  9. 【原创】CA证书申请+IIS配置HTTPS+默认访问https路径

    一.CA证书申请 (一). 新StartSSL注册帐号 1.    StartSSL官网 官方网站:https://www.startssl.com/ 2.    进入到StartSSL后,直接点击注 ...

  10. TKmath Package gp数据类型

    点,向量,方向 二维:gp_Pnt2d, gp_Vec2d, gp_Dir2d:它们的内部都存储 gp_XY 三维:gp_Pnt, gp_Vec, gp_Dir:它们的内部都存储 gp_XYZ 轴向与 ...