BZOJ2424 [HAOI2010]订货

来源:互联网 发布:新网域名转入万网 编辑:程序博客网 时间:2024/05/06 20:37

还以为是傻逼题,结果发现仓库还有容量-_-

看看数据范围,一副网络流的样子

S连每个点,容量INF,费用进货代价

每个点连T,容量需求量,费用0

除了最后一个点每个点连下一个点,容量仓库容量,费用存储费用

跑最小费用最大流

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 1010#define MAXM 2010#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longstruct vec{int to;int fro;int v;int f;};vec mp[MAXM];int tai[MAXN],cnt=1;int q[MAXN],hd,tl;int dis[MAXN];bool iq[MAXN];int rd[MAXN];int s,t;int answ,ansf;inline void be(int x,int y,int f,int v){mp[++cnt].to=y;mp[cnt].fro=tai[x];tai[x]=cnt;mp[cnt].f=f;mp[cnt].v=v;}inline void bse(int x,int y,int f,int v){be(x,y,f,v);be(y,x,0,-v);}bool spfa(){int i,x,y;memset(dis,0x3f,sizeof(dis));hd=tl=0;dis[s]=0;iq[q[tl++]=s]=1;while(hd!=tl){iq[x=q[hd++]]=0;hd%=MAXN;for(i=tai[x];i;i=mp[i].fro){y=mp[i].to;if(dis[y]>dis[x]+mp[i].v&&mp[i].f){dis[y]=dis[x]+mp[i].v;rd[y]=i;if(!iq[y]){iq[q[tl++]=y]=1;tl%=MAXN;}}}}if(dis[t]>INF){return 0;}int flow=INF;for(i=t;i!=s;i=mp[rd[i]^1].to){flow=min(flow,mp[rd[i]].f);}ansf+=flow;answ+=flow*dis[t];for(i=t;i!=s;i=mp[rd[i]^1].to){mp[rd[i]].f-=flow;mp[rd[i]^1].f+=flow;}return 1;}int n,m,S;int main(){int i,x;scanf("%d%d%d",&n,&m,&S);s=n+1;t=s+1;for(i=1;i<=n;i++){scanf("%d",&x);bse(i,t,x,0);}for(i=1;i<=n;i++){scanf("%d",&x);bse(s,i,INF,x);if(i!=n){bse(i,i+1,S,m);}}while(spfa()){}printf("%d\n",answ);return 0;}/**/


0 0