[HAOI2010][bzoj2424] 订货 [费用流]

时间:2022-09-03 09:21:45

题面

传送门

思路

这题其实挺水的......做过餐巾计划问题就能明白,是同一个道理

首先,显然刚刚好满足每一个月的需求,会得到最优解(废话-_-||)

然后我们发现,货物在不同的月之间的转移,可以比喻为水在不同的几个平行管道之间流动

自然而然地想到网络流

那么,我们给每个月建立一个节点i,建立超级源点和超级汇点

从每个i连边(i,T),费用0,流量为这个月需求量

从S向每个月连边(S,i),费用为这个月的价格,流量无限(因为理论上你随便买都可以)

那么储存就是连边(i,i+1),费用为m,流量为S,这里的流量也很好地体现了限制作用

最后的答案就是(S-T)最小费用最大流了

需要注意的是,这道题里面的流量提供了两个限制:

一个是每个月可以买很多,但是我们输出只有要求的那么多,是一个下限转上限

另一个就是仓库容量,这个是直接把上限用流量表示出来了

由此,我们应当注意到,网络流中的流量上限其实不止可以表示一种决策的最大值

它也可以在一定的贪心和推导以后来表示最小值

所以做题的时候思路一定要大胆一些

说不定这就是个网络流题呢?

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1e9
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
int first[5010],dis[5010],vis[5010],n,m,cnt=-1,ans;
struct edge{
int to,next,w,cap;
}a[600010];
inline void add(int u,int v,int w,int cap){
a[++cnt]=(edge){v,first[u],w,cap};first[u]=cnt;
a[++cnt]=(edge){u,first[v],-w,0};first[v]=cnt;
}
int q[1000010];
bool spfa(int s,int t){
int head=0,tail=1,i,u,v,w;
memset(dis,-1,sizeof(dis));memset(vis,0,sizeof(vis));
q[0]=t;dis[t]=0;vis[t]=1;
while(head<tail){
u=q[head++];vis[u]=0;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;w=a[i].w;
if(a[i^1].cap&&((dis[v]==-1)||(dis[v]>dis[u]-w))){
dis[v]=dis[u]-w;
if(!vis[v]) q[tail++]=v,vis[v]=1;
}
}
}
return ~dis[s];
}
int _min(int l,int r){return (l>r)?r:l;}
int dfs(int u,int t,int limit){
if((u==t)||(!limit)){vis[u]=1;return limit;}
int i,v,f,flow=0,w;vis[u]=1;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;w=a[i].w;
if(dis[v]==dis[u]-w&&a[i].cap&&!vis[v]){
if(!(f=dfs(v,t,_min(limit,a[i].cap)))) continue;
a[i].cap-=f;a[i^1].cap+=f;
ans+=f*w;flow+=f;limit-=f;
if(!limit) return flow;
}
}
return flow;
}
int zkw(int s,int t){
int re=0;
while(spfa(s,t)){
vis[t]=1;
while(vis[t]){
memset(vis,0,sizeof(vis));
re+=dfs(s,t,inf);
}
}
return re;
}
int main(){
memset(first,-1,sizeof(first));
n=read();m=read();int S=read(),i,t1;
for(i=1;i<=n;i++) t1=read(),add(i,n+1,0,t1);
for(i=1;i<=n;i++) t1=read(),add(0,i,t1,inf);
for(i=1;i<n;i++) add(i,i+1,m,S);
zkw(0,n+1);
cout<<ans<<endl;
}

[HAOI2010][bzoj2424] 订货 [费用流]的更多相关文章

  1. 【bzoj2424】&lbrack;HAOI2010&rsqb;订货 费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825296.html 题目描述 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di, ...

  2. BZOJ2424 &lbrack;HAOI2010&rsqb;订货 - 费用流

    题解 (非常裸的费用流 题意有一点表明不清: 该月卖出的商品可以不用算进仓库里面. 然后套上费用流模板 代码 #include<cstring> #include<queue> ...

  3. BZOJ 2424&colon; &lbrack;HAOI2010&rsqb;订货 费用流

    2424: [HAOI2010]订货 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月 ...

  4. 【BZOJ2424】&lbrack;HAOI2010&rsqb;订货(费用流)

    [BZOJ2424][HAOI2010]订货(费用流) 题面 BZOJ 洛谷 题解 傻逼费用流吧... 一开始理解错意思了,仓库大小为\(m\)的含义是留到下个月最多为\(m\),而不是任意时刻的容量 ...

  5. BZOJ 2424&colon; &lbrack;HAOI2010&rsqb;订货(费用流)

    裸的费用流了= =从源点向每个点连费用为di,从汇点向每个点连流量为ui,每个点向下一个点连费用为m,流量为s的边就行了 CODE: #include<cstdio>#include&lt ...

  6. bzoj 2424&colon; &lbrack;HAOI2010&rsqb;订货 (费用流)

    直接费用流,天数就是点数 type arr=record toward,next,cap,cost:longint; end; const maxm=; maxn=; mm=<<; var ...

  7. 【BZOJ】【2424】【HAOI2010】订货

    网络流/费用流 比较简单的题……我一开始想成像软件开发那题一样的做法了……就是每天拆点,S->i (INF,0) .i+n->T (u[i],0) 然后处理购入 S->i+n (IN ...

  8. 【HAOI2010】订货

    可以DP也可以是费用流,然而被我用非常简单的DP破了[开心] 原题: 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定 ...

  9. hdu-5988 Coding Contest&lpar;费用流&rpar;

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

随机推荐

  1. 分布式管理系统-git安装及配置

    安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 安装完成后,还需要最后一步设置,在命令行输入: $ git config - ...

  2. JAVA事务

    一.什么是事务 我们通常会认为事务与数据库有关. 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的操作.事务的正确执行使得数据库从一种状态转换成另外一种状态. 事务必须服从IS ...

  3. poj1026Cipher&lpar;置换群)

    链接 找循环节 然后所有子循环节的最小公倍数就是总的循环节 找结果的时候也按一个个置换来进行转换 不然也TLE #include <iostream> #include<cstdio ...

  4. nginx中时间的管理

    nginx出于性能考虑採用类似lib_event的方式,自己对时间进行了cache,用来降低对gettimeofday()的调用,由于一般来说server对时间的精度要求不是特别的高,只是假设须要比較 ...

  5. vue组件递归

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. ZOJ 3876 JAVA

    题意: 输入年份,求五一假期一共放多少天假.五一假期默认5天,如果5月1号星期一,那么它之前有星期六星期天两天假期, 假期总长度就变成5+2,五一假期结束第二天也需要判断是不是假期. 思路: 使用Ja ...

  7. Django框架的探索

    django框架的路由 django2 路由支持正则匹配,如: re_path(r'^category/(?P<category_id>\d+)/$',CourseCategoryView ...

  8. NIO的通道和缓冲区

    概述 通道和缓冲区是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们. 通道是对原I/O包中的流的模拟.到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象.一个B ...

  9. hadoop内存配置方案

    Configuration File Configuration Setting Value Calculation        8G VM (4G For MR)   yarn-site.xml ...

  10. Dom操作注意事项

    Dom操作注意事项 基本概念: 在 HTML DOM (文档对象模型)中,每个部分都是节点: 文档本身是文档节点 所有 HTML 元素是元素节点 所有 HTML 属性是属性节点 HTML 元素内的文本 ...