洛谷P3778 [APIO2017]商旅——01分数规划
题目:https://www.luogu.org/problemnew/show/P3778
转化有点技巧;
其实直接关注比率的上下两项,也就是盈利和时间;
通过暴枚和 floyd 可以处理出两两点间的最大盈利和最小时间,就不用再去关注原图了;
然后就是裸的01分数规划,枚举 ans ,连完全图,判断正环,若有则答案可行;
注意SPFA里一开始把每个点都入队;还要注意0环,代表此时正好是 ans;
WA了十几遍只因为读入优化少写了一个等号...
细节真令人心碎...50个点,错那么一个两个的...
改成 int ,只把SPFA里的 dis 设成 long long ,就A了...为什么全 long long 就不行啊...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
queue<int>q;
int const maxn=,maxk=,inf=0x3f3f3f3f;
int map[maxn][maxn],val[maxn][maxn],l,r,ans,len[maxn],b[maxn][maxk],s[maxn][maxk];
int n,m,K;
ll dis[maxn];
bool vis[maxn];
int rd()
{
int ret=,f=;char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret*f;
}
bool pd(int nw)
{
while(q.size())q.pop();
for(int i=;i<=n;i++)q.push(i),dis[i]=,vis[i]=len[i]=;//每个点入队
while(q.size())
{
int x=q.front(); q.pop(); vis[x]=;
for(int u=;u<=n;u++)
if(dis[u]<=dis[x]+(ll)val[x][u]-(ll)nw*map[x][u])//0环
{
dis[u]=dis[x]+(ll)val[x][u]-(ll)nw*map[x][u];
if(!vis[u])vis[u]=,q.push(u),len[u]++;
// len[u]=len[x]+1;
// if(!vis[u])vis[u]=1,q.push(u);
if(len[u]>n)return ;
}
}
return ;
}
int main()
{
n=rd(); m=rd(); K=rd();
memset(map,0x3f,sizeof map);
// memset(val,-0x3f,sizeof val);
for(int i=;i<=n;i++)
{
// map[i][i]=0;//
for(int j=;j<=K;j++){b[i][j]=rd(); s[i][j]=rd();}
}
for(int i=,x,y,z;i<=m;i++)
{
x=rd(); y=rd(); z=rd();
if(z<map[x][y])map[x][y]=z;
}
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
// if(map[i][k]!=inf&&map[k][j]!=inf)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
// if(map[i][j]!=inf)
{
// val[i][j]=0;//至少是0
for(int k=;k<=K;k++)
if(b[i][k]!=-&&s[j][k]!=-)
// if(b[i][k]>=0&&s[j][k]>=0)
val[i][j]=max(val[i][j],s[j][k]-b[i][k]),r=max(r,val[i][j]);
} l=;r=inf;
while(l<=r)
{
int mid=(l+r)/;
if(pd(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
return ;
}
洛谷P3778 [APIO2017]商旅——01分数规划的更多相关文章
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...
- 洛谷3778 [APIO2017]商旅
题目:https://www.luogu.org/problemnew/show/P3778 一看就是0/1分数规划.但不能直接套模板,因为有个商品种类的限制. 考虑从a买在b卖,商品种类根本没用,关 ...
- 【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa
题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走 ...
- 洛谷 P4377 [USACO18OPEN]Talent Show + 分数规划
分数规划 分数规划可以用来处理有关分数即比值的有关问题. 而分数规划一般不单独设题,而是用来和dp,图论,网络流等算法结合在一起. 而基础的做法一般是通过二分. 二分题目我们都知道,需要求什么的最小或 ...
- 洛谷2494 [SDOI2011]保密 (分数规划+最小割)
自闭一早上 分数规划竟然还能被卡精度 首先假设我们已经知道了到每个出入口的时间(代价) 那我们应该怎么算最小的和呢? 一个比较巧妙的想法是,由于题目规定的是二分图. 我们不妨通过最小割的形式. 表示这 ...
- BZOJ4898/5367 Apio2017商旅(分数规划+floyd)
如果要在某点买入某物品并在另一点卖出,肯定是走其间最短路径.于是预处理任意两点间的收益和最短路径,连完边二分答案判负环即可,可以全程floyd.注意inf大小. #include<iostrea ...
- 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会
01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...
- 洛谷P3199 [HNOI2009]最小圈(01分数规划)
题意 题目链接 Sol 暴力01分数规划可过 标算应该是这个 #include<bits/stdc++.h> #define Pair pair<int, double> #d ...
- 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows(01分数规划)
题意 题目链接 Sol 复习一下01分数规划 设\(a_i\)为点权,\(b_i\)为边权,我们要最大化\(\sum \frac{a_i}{b_i}\).可以二分一个答案\(k\),我们需要检查\(\ ...
随机推荐
- 七牛云一站式 SSL 证书服务上线,即刻使用最多可省 7 万
2017 年 ,随着谷歌.苹果和腾讯对原 HTTP 的相继限制,全站 HTTPS 已经成为了当下趋势,所以安装 SSL 证书成为网站建设中必不可少的一步. 在 2016 年底,七牛云已经与 Trust ...
- j_spring_security_check 404错误
折腾了好久,还是写一篇备忘 折腾了好久,还是写一篇备忘 首先检查路径 <form class="form-signin" method="POST" ac ...
- Java实验——输出一个数组里面连续子数组最大的和(二)文件操作
在本周的练习中,主要是对上周的实验进行健壮性的完善,即在所能考虑到的情况之中,尽量使自己的程序能够正常地运行. 在上周的实验中,我已经是在编程过程中考虑到用户输入的错误类型的问题,所以这一方面并没有多 ...
- 如何在Win7 x64上的配置32位的PostgreSQL ODBC数据源
在Win7 x64下安装最新版的PostgreSQL 9.x 后,从其官网下载最新的 ODBC驱动,分为普通的32位和64位版本,正常安装后,从已安装软件列表里可以看到两个版本的驱动都已经正确显示出来 ...
- ffm算法
www.csie.ntu.edu.tw/~cjlin/papers/ffm.pdf 读书笔记 The effect of feature conjunctions(组合特征) is difficul ...
- atomic原子操作
C++中对共享数据的存取在并发条件下可能会引起data race的未定义行为,需要限制并发程序以某种特定的顺序执行,有两种方式:1.使用mutex保护共享数据: 2.原子操作 原子操作:针对原子类型操 ...
- AngularJS - $index, $event, $log
原文: https://thinkster.io/egghead/index-event-log --------------------------------------------------- ...
- linux动态库的种种要点
linux下使用动态库,基本用起来还是非常easy.但假设我们的程序中大量使用动态库来实现各种框架/插件,那么就会遇到一些坑,掌握这些坑才有利于程序更稳健地执行. 本篇先谈谈动态库符号方面的问题. 測 ...
- webx启动流程
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTFRpYW5jaGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- Android TextView设置个别字体样式
TextView进一步深化: Textview 能够对其文字进行格式化. 通过查询资料,了解到格式化文字的方式主要分为两大类: 第一类:HTML标签格式化文字 代码 ...