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买某个物品在 ...
随机推荐
- MariaDB数据库性能优化
1. 硬件优化 1.1 内存(Memory) 内存是最重要的因素,因为它允许您调整服务器系统变量.更多的内存意味着可以将更大的密钥和表缓存存储在内存中,从而减少磁盘访问速度,降低一个数量级. 如果未将 ...
- 2017-2018-1 20155331 嵌入式C语言
2017-2018-1 20155331 嵌入式C语言 作业要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零) ...
- Exp8 web基础
20155332<网络对抗>Exp5 MSF基础应用 1.实验环境搭建 1.apache的安装与配置 安装:sudo apt-get install apache2 开启:service ...
- html元素双击事件触发机制猜想及疑惑
今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...
- Js_图片轮播
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- c语言数字图像处理(二):图片放大与缩小-双线性内插法
图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...
- 华为云对Kubernetes在Serverless Container产品落地中的实践经验
华为云容器实例服务,它基于 Kubernetes 打造,对最终用户直接提供 K8S 的 API.正如前面所说,它最大的优点是用户可以围绕 K8S 直接定义运行应用. 这里值得一提是,我们采用了全物理机 ...
- python 游戏(龙的国度)
1. 理清楚游戏思路 实现功能:2个洞穴选择,一个洞穴是好龙,一个洞穴是坏龙,坏龙可以概率屠龙或者概率逃跑选项(后续难度需要增加宝藏获取装备,随机遇见商人,随着游戏进度逐步减少屠龙概率) 2. 计数和 ...
- PBFT_拜占庭容错算法
根据论文<Practical Byzantine Fault Tolerance and Proactive Recovery>整理 Practical byzantine fault t ...
- Selenium--数据驱动(python)
前言: 什么是数据驱动? 从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.说人话,其实就是参数化. 本次介绍2种文件驱动:ini文件和yaml文件 一.ini文件 1 ...