nefu492运输问题
来源:互联网 发布:ethercat协议开放源码 编辑:程序博客网 时间:2024/05/03 21:24
W公司有m个仓库和n 个零售商店。第i 个仓库有ai 个单位的货物;第j 个零售商店需要bj个单位的货物。货物供需平衡,即。从第i 个仓库运送每单位货物到第j 个零售商店的费用为Cij 。试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。 对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案。
与分配问题是一样的,都是最小费用最大流和最大费用最大流。
#include<cstdio>using namespace std;const int mm=111111;const int mn=2222;const int oo=1000000000;int node,src,dest,edge;int reach[mm],flow[mm],cost[mm],next[mm];int head[mn],dis[mn],q[mn],p[mn];bool vis[mn];int a[mn],b[mn],g[mn][mn];inline int min(int a,int b){ return a<b?a:b;}inline void prepare(int _node,int _src,int _dest){ node=_node,src=_src,dest=_dest; for(int i=0;i<node;++i)head[i]=-1,vis[i]=0; edge=0;}inline void addedge(int u,int v,int f,int c){ reach[edge]=v,flow[edge]=f,cost[edge]=c,next[edge]=head[u],head[u]=edge++; reach[edge]=u,flow[edge]=0,cost[edge]=-c,next[edge]=head[v],head[v]=edge++;}bool spfa(){ int i,u,v,l,r=0,tmp; for(i=0;i<node;++i)dis[i]=oo; dis[q[r++]=src]=0; p[src]=p[dest]=-1; for(l=0;l!=r;(++l==mn)?l=0:1) for(i=head[u=q[l]],vis[u]=0;i>=0;i=next[i]) if(flow[i]&&dis[v=reach[i]]>(tmp=dis[u]+cost[i])) { dis[v]=tmp; p[v]=i^1; if(vis[v])continue; vis[q[r++]=v]=1; if(r==mn)r=0; } return p[dest]>=0;}int SpfaFlow(){ int i,delta,ans=0; while(spfa()) { for(i=p[dest],delta=oo;i>=0;i=p[reach[i]]) delta=min(delta,flow[i^1]); for(i=p[dest];i>=0;i=p[reach[i]]) flow[i]+=delta,flow[i^1]-=delta; ans+=delta*dis[dest]; } return ans;}bool spfa1(){ int i,u,v,l,r=0,tmp; for(i=0;i<node;++i)dis[i]=-oo; dis[q[r++]=src]=0; p[src]=p[dest]=-1; for(l=0;l!=r;(++l==mn)?l=0:1) for(i=head[u=q[l]],vis[u]=0;i>=0;i=next[i]) if(flow[i]&&dis[v=reach[i]]<(tmp=dis[u]+cost[i])) { dis[v]=tmp; p[v]=i^1; if(vis[v])continue; vis[q[r++]=v]=1; if(r==mn)r=0; } return p[dest]>=0;}int SpfaFlow1(){ int i,delta,ans=0; while(spfa1()) { for(i=p[dest],delta=oo;i>=0;i=p[reach[i]]) delta=min(delta,flow[i^1]); for(i=p[dest];i>=0;i=p[reach[i]]) flow[i]+=delta,flow[i^1]-=delta; ans+=delta*dis[dest]; } return ans;}int main(){ int n,m,i,j,tmp; while(~scanf("%d%d",&n,&m)) { prepare(n+m+2,0,n+m+1); for(i=1;i<=n;i++) { scanf("%d",&a[i]); addedge(src,i,a[i],0); } for(i=1;i<=m;i++) { scanf("%d",&b[i]); addedge(i+n,dest,b[i],0); } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&g[i][j]); addedge(i,j+n,oo,g[i][j]); } } printf("%d\n",SpfaFlow()); prepare(n+m+2,0,n+m+1); for(i=1;i<=n;i++) { addedge(src,i,a[i],0); } for(i=1;i<=m;i++) { addedge(i+n,dest,b[i],0); } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { addedge(i,j+n,oo,g[i][j]); } } printf("%d\n",SpfaFlow1()); } return 0;}
- nefu492运输问题
- 运输问题
- 运输问题
- 运输问题
- mmc运输问题
- mmc生产运输问题
- wikioi1914 运输问题
- wiki 1914 运输问题
- [codevs 1914] 运输问题
- 运输问题2
- 骆驼运输香蕉问题解析
- mmc生产运输投资问题
- 用lingo解决运输问题
- 运输公司计算运费问题
- [图论] NKOJ 1952 运输问题
- 运输问题--替换型贪心
- 十七、运输问题 [费用流问题]
- 糖果传递问题和仓库运输问题
- 程序员的学习和积累
- Ubuntu Linux 开启 root 用户及其它登录问题的解决
- SOAP 编码对 Web 服务性能的影响
- pImagingFactory在release版本中使用注意事项
- c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)
- nefu492运输问题
- 制作keystore用于android打包
- Ubuntu Linux 开启 ssh 服务
- 关于年长程序员的5个误传
- 消除Word 空格处显示点...
- iPhone开发 — 保存日志
- javascript语法汇总
- java-String StringBuffer和StringBuilder的区别
- ob_get_contents(); ob_end_clean(); ob_start()用法