想看更多图论题目?请点击:http://blog.csdn.net/martinue/article/category/5601005

Description

W公司有m个仓库和n 个零售商店。第i 个仓库有ai 个单位的货物;第j 个零售商店需要bj个单位的货物。货物供需平衡,即
。从第i 个仓库运送每单位货物到第j 个零售商店的费用为Cij 。试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。
    对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案。

Input

多组数据输入.
每组输入第1行有2 个正整数m和n,分别表示仓库数和零售商店数。接下来的一行中有m个正整数ai ,1≤i≤m,表示第i个仓库有ai 个单位的货物。再接下来的一行中有n个正整数bj ,1≤j≤n,表示第j个零售商店需要bj 个单位的货物。接下来的m行,每行有n个整数,表示从第i 个仓库运送每单位货物到第j个零售商店的费用Cij 。

Output

每组输出最少运输费用和最多运输费用

Sample Input

2 3
220 280
170 120 210
77 39 105
150 186 122

Sample Output

48500

69140

题目出自nefu492

思路:

首先求最小费用,就是一个裸的最小费用最大流问题了,建立源点汇点,源点连接n个点,m个点连接汇点,然后n个点与m个点之间相互连边,跑一个最小费用流就ok。

然后相对麻烦点儿的是最大费用,其实也不麻烦,只是建图的时候稍微变一下就ok了,将n个点与m个点之间连边的时候将其费用化成相反数,然后跑一遍最小费用流,结果取反就是anser~

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const   int oo=1e9;
const   int mm=11111111;
const   int mn=888888;
int node,src,dest,edge;
int ver[mm],flow[mm],cost[mm],nex[mm];
int head[mn],dis[mn],p[mn],q[mn],vis[mn];
/**这些变量基本与最大流相同,增加了cost 表示边的费用,p记录可行流上节点对应的反向边*/
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;
}
void addedge(int u,int v,int f,int c)
{ver[edge]=v,flow[edge]=f,cost[edge]=c,nex[edge]=head[u],head[u]=edge++;ver[edge]=u,flow[edge]=0,cost[edge]=-c,nex[edge]=head[v],head[v]=edge++;
}
bool spfa()/**spfa 求最短路,并用 p 记录最短路上的边*/
{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:l)for(i=head[u=q[l]],vis[u]=0; i>=0; i=nex[i])if(flow[i]&&dis[v=ver[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]>-1;
}
int SpfaFlow()/**源点到汇点的一条最短路即可行流,不断的找这样的可行流*/
{int i,ret=0,delta;while(spfa()){for(i=p[dest],delta=oo; i>=0; i=p[ver[i]])if(flow[i^1]<delta)delta=flow[i^1];for(i=p[dest]; i>=0; i=p[ver[i]])flow[i]+=delta,flow[i^1]-=delta;ret+=delta*dis[dest];}return ret;
}
int a[10005],b[10005],x[10005][10005];
int main()
{int m,n;while(~scanf("%d%d",&n,&m)){prepare(n+m+2,0,n+m+1);for(int i=1; i<=n; i++){scanf("%d",&a[i]);addedge(0,i,a[i],0);}for(int i=1; i<=m; i++){scanf("%d",&b[i]);addedge(i+n,n+m+1,b[i],0);}for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){scanf("%d",&x[i][j]);addedge(i,j+n,oo,x[i][j]);}printf("%d\n",SpfaFlow());prepare(n+m+2,0,n+m+1);for(int i=1; i<=n; i++)addedge(0,i,a[i],0);for(int i=1; i<=m; i++)addedge(i+n,n+m+1,b[i],0);for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)addedge(i,j+n,oo,-x[i][j]);printf("%d\n",-SpfaFlow());}return 0;
}

运输问题(最小费用流)相关推荐

  1. 【图论】网络流——最大流和最小费用流

    [图论]网络流--最大流和最小费用流 文章目录 [图论]网络流--最大流和最小费用流 1. 最大流问题 1.1 基本概念 1.2 寻求最大流的算法(Ford-Fulerson) 1.3 matlab求 ...

  2. 【数学建模】图论模型(基础理论+最大流与最小费用流问题)

    图论模型 基础理论 1.无向图与有向图 有向图的边称为弧,有向图一般记为 D = ( V , A ) D=(V,A) D=(V,A),其中 V V V 为顶点集, A A A 为弧集. 边的表示 ( ...

  3. 【多式联运】基于matlab遗传算法求解多式联运运输问题(考虑碳交易)【含Matlab源码 1997期】

    一.联运运输简介 1 引言 运输问题(Transportation Problem)是一类特殊的线性规划问题,最早是由Hichcock于1941年提出的,由于它不仅能解决物资的合理调运和车辆的合理调度 ...

  4. 【多式联运】基于matlab遗传算法求解多式联运运输问题(考虑碳税)【含Matlab源码 1996期】

    ⛄一.联运运输简介 1 引言 运输问题(Transportation Problem)[1]是一类特殊的线性规划问题,最早是由Hichcock于1941年提出的,由于它不仅能解决物资的合理调运和车辆的 ...

  5. poj3686(最小费用流)

    题目大概意思为有N个玩具,M个工厂,每个工厂一次只能生产一个玩具,顺序任意,求所有玩具的加工完的平均时间最小值 例:N = 3 M = 2 Z = {{1,100},{100,1},{1,100}} ...

  6. poj3680(最小费用流 + 拆点)

    (又是一道简单的最小费用流的题目) 题目大概意思为有N个带权的开区间,现在从中选取一些区间,使任意点都不能被超过k个区间覆盖,求最大权重和 首先我们求得是最大的权重和,所以我们把 权重 ,看为 -权重 ...

  7. poj3422(最小费用流 + 拆点)

    题目大概意思为有一个N × N矩阵,每个格子里都有一个非负数,一辆车从左上方的网格移动到右下方的网格k次(车只向右或向下移动).每次访问格子后,其替换为0,且将其加入到金额中.求第k次旅行后能得到的最 ...

  8. poj2195(最小费用流)

    (最小费用流的入门基础题) 题目大概意思为在一个矩阵中,有n个小人和n个房子,小人每走一格花费1美元,小人只能上下左右走,且可以经过房子但不进去,为了让每个小人有自己的房子,求最小费用 首先统计每个小 ...

  9. poj3068(最小费用流)

    (和poj2135很像很像,就多了一个情况而已,基础入门题) 题目大概意思为总共有N个仓库,求两条不同路径从起点到达终点,若是没有两条,打出Not possible,若是有可能打出所需最小费用 很简单 ...

最新文章

  1. 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析
  2. MySQL面试题 | 附答案解析(四)
  3. java-vector hashtable过时?
  4. Oracle不同系统之间时间转换(NLS_DATE_LANGUAGE )
  5. 【NLP】中文BERT上分新技巧,多粒度信息来帮忙
  6. Hadoop下载和源码阅读
  7. UVA 10404 - Bachet's Game
  8. Android之launchMode总结
  9. php表单密码由加密变明文,PHP 安全性漫谈 Linux+Apache+Mysql+PHP
  10. VR--VIVE-SteamVR API
  11. 推荐系统系列教程之十二:Facebook是怎么为十亿人互相推荐好友的?
  12. ARM 交叉编译器命名规则
  13. mysql 嵌入式linux版本_PHP专栏 : MySQL 数据库安装详细
  14. 注塑模具设计的技术知识汇总
  15. 圣诞邀请助力活动H5系统开发
  16. Unity 父子约束 手持弓箭
  17. cz73 读取速度慢_【闪迪 Ultra Flair 酷铄 CZ73 闪存盘使用总结】速度|读取|写入|手感_摘要频道_什么值得买...
  18. visual studio安装进度条为零,检查网络链接;aka.ms拒绝连接,因为使用的HSTS...;无法访问github.com;外网无法访问
  19. 横井军平(WIKI资源收集)
  20. 三、C++学习笔记——处理数据

热门文章

  1. 什么是面向对象编程和面向对象编程语言
  2. java数组元素取出,存入
  3. python list使用print输出中文乱码
  4. ubuntu 16.04 1080Ti 安装Cuda
  5. Ubuntu GIT切换分支
  6. node.js抓取网络图片保存到本地,node.js抓取防盗链网络图片保存到本地
  7. 如何画Q版角色?动漫Q版角色怎么设计?
  8. Bootstrap栅格系统 显示当前屏幕大小和种类
  9. 用c语言编写MIDI程序,使用C语言编写钢琴小程序
  10. SQL语句练习day1:游戏玩法分析1