bzoj2424: [HAOI2010]订货(费用流)

2424: [HAOI2010]订货

题目:传送门



题解:

   做多了最小割,做一下费用流练手

   其实很容易就看出来是费用流啊,伏地魔肉老师用单调队列ORZ

   st直接连每个月,流量无限(随便买,花钱而已),费用就是给出来的

   然后因为可以贮存嘛,那就第i个月连第i+1个月,流量为S(仓库容量),费用为m就OK

   最后就是卖出去咯,第i个月连ed流量为需要的,费用为0

   难受,打个spfa忘记出队列...

  



代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define inf 999999999
 7 using namespace std;
 8 struct node
 9 {
10     int x,y,c,d,next,other;
11 }a[1100];int len,last[110];
12 void ins(int x,int y,int c,int d)
13 {
14     int k1,k2;
15     k1=++len;
16     a[len].x=x;a[len].y=y;a[len].c=c;a[len].d=d;
17     a[len].next=last[x];last[x]=len;
18
19     k2=++len;
20     a[len].x=y;a[len].y=x;a[len].c=0;a[len].d=-d;
21     a[len].next=last[y];last[y]=len;
22
23     a[k1].other=k2;
24     a[k2].other=k1;
25 }
26 int list[11000],la[11000],d[11000],st,ed,n,m,head,tail,ans,S;
27 bool v[11000];
28 bool spfa()
29 {
30     for(int i=1;i<=ed;i++)d[i]=inf;
31     memset(v,false,sizeof(v));memset(la,0,sizeof(la));
32     list[1]=st;d[st]=0;v[st]=true;head=1;tail=2;
33     while(head!=tail)
34     {
35         int x=list[head];
36         for(int k=last[x];k;k=a[k].next)
37         {
38             int y=a[k].y;
39             if(a[k].c>0 && d[y]>d[x]+a[k].d)
40             {
41                 d[y]=d[x]+a[k].d;la[y]=k;
42                 if(v[y]==false)
43                 {
44                     v[y]=true;
45                     list[tail++]=y;
46                     if(tail==ed+1)tail=1;
47                 }
48             }
49         }
50         head++;if(head==ed+1)head=1;
51         v[x]=false;
52     }
53     if(d[ed]==inf)return false;
54     return true;
55 }
56 int g_f()
57 {
58     int x,k,f=inf,ans=0;
59     x=ed;while(x!=st){k=la[x];f=min(f,a[k].c);x=a[k].x;}
60     x=ed;while(x!=st){k=la[x];ans+=f*a[k].d;a[k].c-=f;a[a[k].other].c+=f;x=a[k].x;}
61     return ans;
62 }
63 int A[110],B[110];
64 int main()
65 {
66     scanf("%d%d%d",&n,&m,&S);len=0;memset(last,0,sizeof(last));st=n+1,ed=st+1;
67     for(int i=1;i<=n;i++)scanf("%d",&A[i]);
68     for(int i=1;i<=n;i++)scanf("%d",&B[i]);
69     for(int i=1;i<=n;i++)ins(st,i,inf,B[i]);
70     for(int i=1;i<=n;i++){if(i!=n)ins(i,i+1,S,m);ins(i,ed,A[i],0);}
71     int ans=0;while(spfa())ans+=g_f();
72     printf("%d\n",ans);
73     return 0;
74 }

原文地址:https://www.cnblogs.com/CHerish_OI/p/8663003.html

时间: 2024-10-12 02:32:04

bzoj2424: [HAOI2010]订货(费用流)的相关文章

BZOJ 2424: [HAOI2010]订货 费用流

2424: [HAOI2010]订货 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2424 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后

bzoj2424: [HAOI2010]订货

最小费用最大流即可.-=a[t] 写成了-=-a[t],于是为此找了很久的错QAQsading #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(

BZOJ 2424: [HAOI2010]订货(最小费用最大流)

最小费用最大流..乱搞即可 ------------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> #define rep( i, n ) for( int i = 0; i <

【BZOJ2424】[HAOI2010]订货 最小费用流

[BZOJ2424][HAOI2010]订货 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. Input 第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S&

[费用流]Bzoj P2424 订货

Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. Input 第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000) 第2行:U1 , U2

bzoj:2424: [HAOI2010]订货

Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. Input 第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000) 第2行:U1 , U2

[HAOI2010]订货

题目描述 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. 输入输出格式 输入格式: 第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000) 第2行:U1 , U2

【网络流24题】No.19 负载平衡问题 (费用流)

[题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input.txt517 9 14 16 4 输出文件示例output.txt11 [分析] 其实我觉得这题可以贪心啊..n^2贪心??.没细想.. 打的是费用流.. 大概这样建图: 懒得写了..凌乱之美.. 求满流费用.. 1 #include<cstdio> 2 #include<cstdlib&

POJ 3422 kaka&#39;s matrix trvals(费用流)

#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <cma