luogu3778/bzoj4898 商旅 (floyd+分数规划+spfa)
首先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)的更多相关文章
- 【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa
题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走 ...
- [APIO2017]商旅(floyd+分数规划+SPFA)
题解:首先肯定要跑最短路,而n<=100,所以可以用floyd,然后根据比值,很容易想到二分答案,然后再SPFA跑一遍负环,就能求出解了. #include<bits/stdc++.h&g ...
- 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 ...
- 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 ...
- bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
其实并不会分数规划 因为要最大化 ans=总收益/总路程 ,所以考虑二分答案,找到一条 ans<=总收益/总路程 的回路.先预处理出d(i,j)为(i,j)最短路,w(i,j)为在i买某个物品在 ...
随机推荐
- 大数据入门第十四天——Hbase详解(三)hbase基本原理与MR操作Hbase
一.基本原理 1.hbase的位置 上图描述了Hadoop 2.0生态系统中的各层结构.其中HBase位于结构化存储层,HDFS为HBase提供了高可靠性的底层存储支持, MapReduce为HBas ...
- 20155229《网络对抗技术》Exp3:免杀原理与实践
实验预习 免杀: 看为一种能使病毒木马避免被杀毒软件查杀的技术. 免杀的分类: 开源免杀:指在有病毒.木马源代码的前提下,通过修改源代码进行免杀.. 手工免杀:指在仅有病毒.木马的可执行文件(.exe ...
- 20155330 《网络攻防》 Exp4 恶意代码分析
20155330 <网络攻防> Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操 ...
- WPF编程,通过Path类型制作沿路径运动的动画另一种方法。
原文:WPF编程,通过Path类型制作沿路径运动的动画另一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/d ...
- Luogu P1113 杂务
终于没有打模板题了. 一道简单的拓扑题目(但记得以前第一次做的时候爆0了). 发现这个做事的过程是按一定顺序的,然后如果一个工作的前面没有任何事情的话,它一定先被完成(如果不的话就不能使时间最小化,其 ...
- 关于Map迭代循环,key和value的顺序问题
使用Hashtable,keySet()返回的顺序为降序(key降顺序) ---->6, 5, 4, 3, 2, 1使用TreeMap,keySet()返回的顺序为升序(key升顺序) ---- ...
- Hadoop 部署文档
Hadoop 部署文档 1 先决条件 2 下载二进制文件 3 修改配置文件 3.1 core-site.xml 3.2 hdfs-site.xml 3.3 mapred-site.xml 3.4 ya ...
- 微软职位内部推荐-Senior Software Engineer - Back End
微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...
- Final阶段基于spec评论作品
组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶 刘佳瑞 公冶令鑫 杨磊 刘欣 张宇 卢帝同 一.测试目标:拉格朗日2018——飞词 1.开始界面,只有一个开始游戏按钮,简约且醒目 ...
- 2-Twelfth Scrum Meeting20151212
任务安排 成员 今日完成 明日任务 闫昊 获取视频播放的进度 获取视频播放进度 唐彬 解决handler可能引起的内存泄露问题 阅读IOS代码+阅读上届网络核心代码 史烨轩 下载service开发 ...