【BZOJ】【2424】【HAOI2010】订货

网络流/费用流



  比较简单的题……我一开始想成像软件开发那题一样的做法了……就是每天拆点,S->i (INF,0) 、i+n->T (u[i],0) 然后处理购入 S->i+n (INF,v[i]) 以及放置仓库 i->i+1 (s,m)、i->i+n+1 (s,m)

  然后顺利WA了……没想通为什么……

  实际上不用拆的,直接建就可以S->i (INF,0)、 i->T (u[i],0)、 i->i+1 (s,m) 就连这三种边就行了= =

 1 /**************************************************************
 2     Problem: 2424
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:7136 kb
 8 ****************************************************************/
 9
10 //BZOJ 2424
11 #include<cmath>
12 #include<vector>
13 #include<cstdio>
14 #include<cstring>
15 #include<cstdlib>
16 #include<iostream>
17 #include<algorithm>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 #define pb push_back
22 #define CC(a,b) memset(a,b,sizeof(a))
23 using namespace std;
24 int getint(){
25     int v=0,sign=1; char ch=getchar();
26     while(!isdigit(ch)) {if(ch==‘-‘) sign=-1; ch=getchar();}
27     while(isdigit(ch))  {v=v*10+ch-‘0‘; ch=getchar();}
28     return v*sign;
29 }
30 const int N=250,M=250000,INF=~0u>>2;
31 const double eps=1e-8;
32 /*******************template********************/
33 int n,m,size,ans;
34 struct edge{int from,to,v,c;};
35 struct Net{
36     edge E[M];
37     int head[N],next[M],cnt;
38     void ins(int x,int y,int z,int c){
39         E[++cnt]=(edge){x,y,z,c};
40         next[cnt]=head[x]; head[x]=cnt;
41     }
42     void add(int x,int y,int z,int c){
43         ins(x,y,z,c); ins(y,x,0,-c);
44     }
45     int from[N],Q[M],d[N],S,T;
46     bool inq[N];
47     bool spfa(){
48         int l=0,r=-1;
49         F(i,1,T) d[i]=INF;
50         d[S]=0; Q[++r]=S; inq[S]=1;
51         while(l<=r){
52             int x=Q[l++]; inq[x]=0;
53             for(int i=head[x];i;i=next[i])
54                 if(E[i].v && d[x]+E[i].c<d[E[i].to]){
55                     d[E[i].to]=d[x]+E[i].c;
56                     from[E[i].to]=i;
57                     if(!inq[E[i].to]){
58                         Q[++r]=E[i].to;
59                         inq[E[i].to]=1;
60                     }
61                 }
62         }
63         return d[T]!=INF;
64     }
65     void mcf(){
66         int x=INF;
67         for(int i=from[T];i;i=from[E[i].from])
68             x=min(x,E[i].v);
69         for(int i=from[T];i;i=from[E[i].from]){
70             E[i].v-=x;
71             E[i^1].v+=x;
72         }
73         ans+=x*d[T];
74     }
75     void init(){
76         n=getint(); m=getint(); size=getint();
77         cnt=1; S=0; T=n+1;
78         int x;
79         F(i,1,n){
80             x=getint();
81             add(i,T,x,0);
82         }
83         F(i,1,n){
84             x=getint();
85             add(S,i,INF,x);
86             if (i<n) add(i,i+1,size,m);
87         }
88         while(spfa()) mcf();
89         printf("%d\n",ans);
90     }
91 }G1;
92 int main(){
93 #ifndef ONLINE_JUDGE
94     freopen("input.txt","r",stdin);
95 //  freopen("output.txt","w",stdout);
96 #endif
97     G1.init();
98     return 0;
99 }

时间: 2024-10-29 12:50:39

【BZOJ】【2424】【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个月订购计划,才能使成本最低?每月月初订购,订购后

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

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

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

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(

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

2424: [HAOI2010]订货 题目:传送门 题解: 做多了最小割,做一下费用流练手 其实很容易就看出来是费用流啊,伏地魔肉老师用单调队列ORZ st直接连每个月,流量无限(随便买,花钱而已),费用就是给出来的 然后因为可以贮存嘛,那就第i个月连第i+1个月,流量为S(仓库容量),费用为m就OK 最后就是卖出去咯,第i个月连ed流量为需要的,费用为0 难受,打个spfa忘记出队列... 代码: 1 #include<cstdio> 2 #include<cstring> 3

【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&

P2517 [HAOI2010]订货(dp)

P2517 [HAOI2010]订货 设$f[i][j]$表示第$i$个月,库存为$j$的最小代价 枚举上个月的库存$k$,那么$f[i][j]=f[i-1][k]+(j+U[i]-k)*D[i]+j*m,k<=min(j+U[i],S)$ 复杂度$O(nS^2)$ 把上面的方程拆项 $f[i][j]=(j+U[i])*D[i]+j*m+{f[i-1][k]-k*D[i]},k<=min(j+U[i],S)$ 这个$k$可以直接跟着$j$维护,连单调队列都不用开 复杂度$O(nS)$ #inc

订货(bzoj 2424)

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 订货(贪心+单调队列)

怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. 首先这道题和经典的汽车加油问题差不多,那道题可以用单调队列做,然而这道题也是可以的. 此题唯一的难点在于存储费用m,也

BZOJ 2424 订货

费用流. #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #define maxv 250 #define maxe 1000050 #define inf 2000000000 using namespace std; int n,m,S,u[maxv],d[maxv],nume=1,g[maxv],dis[max