[BZOJ4898] [Apio2017]商旅

[传送门](JudgeOnline/upload/201806/merchant (zh_CN).pdf)

试题分析

考虑两个点之间的路径,显然如果交易的话肯定选\(S_{t,i}-B_{s,i}\)最大的。

那么我们可以先用\(Cost\)把两个点的最大收益预处理出来,然后找正环就可以了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<algorithm> using namespace std;
#define LL long long inline int read(){
int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const double INF = 1e12;
const int MAXN = 100010;
const double eps = 1e-6; int N,M,K;
double B[101][1001],S[101][1001];
double E[101][101],Fd[101][101],Cost[101][101];
double dis[MAXN+1]; bool inq[MAXN+1];
int cnt[MAXN+1]; inline bool check(double r){
queue<int> que;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i!=j&&Cost[i][j]>=0) E[i][j]=Cost[i][j]-r*Fd[i][j];
else E[i][j]=-INF;
} dis[i]=0.0; que.push(i); inq[i]=true;
//cout<<endl;
} //memset(inq,false,sizeof(inq));
memset(cnt,0,sizeof(cnt));
while(!que.empty()){
int k=que.front(); inq[k]=false; que.pop();
for(int v=1;v<=N;v++){
if(dis[v]<dis[k]+E[k][v]){
dis[v]=dis[k]+E[k][v];
if(!inq[v]){
inq[v]=true; ++cnt[v];
que.push(v); if(cnt[v]>N) return true;
}
}
}
} return false;
} int main(){
//freopen("a.in","r",stdin);
//freopen(".out","w",stdout);
N=read(),M=read(),K=read();
for(int i=1;i<=N;i++){
for(int j=1;j<=K;j++){
B[i][j]=read();
S[i][j]=read();
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++) E[i][j]=INF;
}
for(int i=1;i<=M;i++){
int u=read(),v=read(); double w=read();
E[u][v]=min(w,E[u][v]);
} double Mx=0;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(j!=i){
double ret=0;
for(int k=1;k<=K;k++)
if(S[i][k]!=-1&&B[j][k]!=-1)
ret=max(ret,S[i][k]-B[j][k]);
Cost[j][i]=ret; Mx=max(Mx,ret);
} else Cost[j][i]=-INF;
Fd[i][j]=E[i][j];
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++)
for(int k=1;k<=N;k++)
Fd[j][k]=min(Fd[j][k],Fd[j][i]+Fd[i][k]);
}
double l=0,r=Mx,ans=0;
while(r-l>=eps){
double mid=(l+r)/2.0;
if(check(mid)) ans=mid,l=mid;
else r=mid;
} if((int)floor(ans)==0&&(int)(floor(ans+(1e-6)))==1) puts("0");
else printf("%d\n",(int)(floor(ans+(1e-6))));
return 0;
}

[BZOJ4898] [Apio2017]商旅的更多相关文章

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

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

  2. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

  3. 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会

    01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...

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

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

  5. BZOJ4898/5367 Apio2017商旅(分数规划+floyd)

    如果要在某点买入某物品并在另一点卖出,肯定是走其间最短路径.于是预处理任意两点间的收益和最短路径,连完边二分答案判负环即可,可以全程floyd.注意inf大小. #include<iostrea ...

  6. BZOJ4898 & BZOJ5367 & 洛谷3778:[APIO2017]商旅——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4898 https://www.lydsy.com/JudgeOnline/problem.php? ...

  7. 【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa

    题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走 ...

  8. bzoj4898 & loj2308 [Apio2017]商旅 最短路+01分数规划

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4898 https://loj.ac/problem/2308 题解 发现我们可以把整个环路分成 ...

  9. 【bzoj4898】商旅

    Portal -->bzoj4898 Solution ​ 这题的话..首先答案的形式应该是\(01\)分数规划了 ​ 然后比较关键的一步在于,我们需要简化一下交易的过程 ​ 具体一点就是,我们 ...

随机推荐

  1. 2、MySQL常见数据库引擎及比较?

    MySQL存储引擎简介 MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: MyISAM管理非事务表.它提供高速存储和检索,以及 ...

  2. Vue 双向绑定原理

    Vue.js最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统. 一.访问器属性:Object.defineProperty ECMAScript 262v5带来的新东西,FF把它归入为jav ...

  3. js 基本类型&引用类型

    1.基本的数据类型有:undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值 基本类型的比较是值的比较.用==比较 ...

  4. 变量对象vs活动对象

    这是我见过描述的最为详尽的关于变量对象.活动对象以及闭包的解析,来自知乎,感谢答主: 作者:闭家锁链接:https://www.zhihu.com/question/36393048/answer/7 ...

  5. 项目记录 -- python调用回调函数

    C源文件: static int get_callback(zpool_handle_t *zhp, void *data) { zprop_get_cbdata_t *cbp = (zprop_ge ...

  6. 动归专题QAQ(两天创造的刷题记录哟!✿✿ヽ(°▽°)ノ✿✿)(未填坑)

    1092 采药:由于没有限制开始时间和结束时间,01背包就好了 1095 开心的金明:01背包,无fuck说 1104 摆花:f[i][j]表示摆了i种花,第i种花摆了j种的方案数,乱转移0.0(感觉 ...

  7. 2017-2018-1 20179205《Linux内核原理与设计》第三周作业

    <Linux内核原理与分析>第三周作业 教材学习总结 第三章 进程管理 进程是Unix操作系统抽象概念中最基本的一种,是正在执行的程序代码的实时结果:线程,是在进程中活动的对象.而Linu ...

  8. Keil MDK 5.14 仿真时System Viewer菜单显示空白和Peripherals菜单无外设寄存器

    keil mdk5.14新建工程进行仿真时,进入Debug环境发现System Viewer菜单显示空白,Peripherals菜单没有外设寄存器.如图1和图2所示.打开Oprons for Targ ...

  9. 网络设备之分配net_device结构

    注册网络设备时,会调用pci_driver->probe函数,以e100为例,最终会调用alloc_netdev_mqs来分配内存,并且在分配内存后调用setup函数(以太网为ether_set ...

  10. linux驱动基础系列--Linux 串口、usb转串口驱动分析

    前言 主要是想对Linux 串口.usb转串口驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如字符设备驱动.平台驱动等也不进行详细说明原理.如果有任何错误地方,请指出, ...