[BZOJ 2424][HAOI2010]订货(费用流)
生活随笔
收集整理的這篇文章主要介紹了
[BZOJ 2424][HAOI2010]订货(费用流)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
某公司估計市場在第i個月對某產品的需求量為Ui,已知在第i月該產品的訂貨單價為di,上個月月底未銷完的單位產品要付存貯費用m,假定第一月月初的庫存量為零,第n月月底的庫存量也為零,問如何安排這n個月訂購計劃,才能使成本最低?每月月初訂購,訂購后產品立即到貨,進庫并供應市場,于當月被售掉則不必付存貯費。假設倉庫容量為S。Solution
一道建圖比較明顯的費用流
從s向每一天i連容量為INF費用為di的邊
從每一天i向t連容量為ui費用為0的邊
每一天向下一天連容量為S費用為m的邊
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> #define INF 0x3f3f3f3f using namespace std; int n,m,S,s,t; int head[505],cnt=0,a[505],dis[505],pre[505]; bool inq[505]; int read() {int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; } struct Node {int next,from,to,cap,w; }Edges[5005]; void addedge(int u,int v,int c,int w) {Edges[cnt].next=head[u];head[u]=cnt;Edges[cnt].from=u;Edges[cnt].to=v;Edges[cnt].cap=c;Edges[cnt++].w=w; } void insert(int u,int v,int c,int w) {addedge(u,v,c,w);addedge(v,u,0,-w); } queue<int>q; int MCMF() {int flow=0,cost=0;while(1){memset(a,0,sizeof(a));memset(dis,0x3f,sizeof(dis));q.push(s);a[s]=INF,dis[s]=0,inq[s]=1,pre[s]=-1;while(!q.empty()){int u=q.front();q.pop(),inq[u]=0;for(int i=head[u];~i;i=Edges[i].next){int v=Edges[i].to;if(dis[v]>dis[u]+Edges[i].w&&Edges[i].cap>0){dis[v]=dis[u]+Edges[i].w;a[v]=min(a[u],Edges[i].cap);pre[v]=i;if(!inq[v])inq[v]=1,q.push(v);}}}if(!a[t])break;flow+=a[t],cost+=a[t]*dis[t];int p=t;while(pre[p]!=-1){Edges[pre[p]].cap-=a[t];Edges[pre[p]^1].cap+=a[t];p=Edges[pre[p]].from;}}return cost; } int main() {memset(head,-1,sizeof(head));n=read(),m=read(),S=read();s=0,t=n+1;for(int i=1;i<=n;i++){int u=read();insert(i,t,u,0);}for(int i=1;i<=n;i++){int d=read();insert(s,i,INF,d);if(i!=n)insert(i,i+1,S,m);}printf("%d\n",MCMF());return 0; }?
轉載于:https://www.cnblogs.com/Zars19/p/6870286.html
總結
以上是生活随笔為你收集整理的[BZOJ 2424][HAOI2010]订货(费用流)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go语言之标志符可见性
- 下一篇: idea如何彻底删除一个项目