概念

在同一个网络中,可能存在多个总流量相同的最大流,我们可以在计算流量的基础之上,给网络中的弧增加一个单位流量费用(简称费用),在确保流量最大的前提下总费用最小——最小费用最大流。

算法思路

边权的数据有两个,一个是容量,一个是费用。

主要是两部分,①spfa来求边权(根据费用w)最短路;②在最短路基础上统计计算最小费用的。用spfa求出最短路(其中有个pre[i]数组表示指向i点的边序号),然后再倒序从终点沿着最短路走反向边,找到该最短路上的最小边权——流量。然后再来走一遍,这次需要每次都把最小费用统计一下(+=最小流量*费用),同时从当前边权容量上减去当前流量,以便进入下一次循环的spfa。

const int MAX_N = 1000;
const int MAX_M = 10000;
const int inf = 0x3f3f3f3f;struct edge {int v, c, w, next;  // v 表示边的另一个顶点,c 表示当前剩余容量,w 表示单位流量费用
} e[MAX_M];
int p[MAX_N], s, t, eid;  // s 表示源点,t 表示汇点,需要在进行 costflow 之前设置完毕
void init() {memset(p, -1, sizeof(p));eid = 0;
}
void insert(int u, int v, int c, int w) {e[eid].v = v;e[eid].c = c;e[eid].w = w;e[eid].next = p[u];p[u] = eid++;
}
void addedge(int u, int v, int c, int w) {insert(u, v, c, w);insert(v, u, 0, -w);
}
bool inq[MAX_N];
int d[MAX_N];  // 如果到顶点 i 的距离是 0x3f3f3f3f,则说明不存在源点到 i 的最短路
int pre[MAX_N];  // 最短路中连向当前顶点的边的编号
bool spfa() {  // 以源点 s 为起点计算单源最短路,如果不存在从 s 到 t 的路径则返回 false,否则返回 truememset(inq, 0, sizeof(inq));memset(d, 0x3f, sizeof(d));memset(pre, -1, sizeof(pre));d[s] = 0;inq[s] = true;queue<int> q;q.push(s);while (!q.empty()) {int u = q.front();q.pop();inq[u] = false;for (int i = p[u]; i != -1; i = e[i].next) {if (e[i].c) {    //注意这个条件!!!spfa这里是以w求最短路的,但仍然不能忽略容量c的考虑!int v = e[i].v;if (d[u] + e[i].w < d[v]) {d[v] = d[u] + e[i].w;pre[v] = i;if (!inq[v]) {q.push(v);inq[v] = true;}}}}}return pre[t] != -1;
}int costflow() {  // 计算最小费用最大流int ret = 0;  // 累加和while(spfa()) {int flow = inf;for(int i = t; i != s; i = e[pre[i]^1].v) {flow = min(e[pre[i]].c, flow);  // 计算当前增广路上的最小流量}for(int i = t; i != s; i = e[pre[i]^1].v) {e[pre[i]].c -= flow;     //容量是一定要跟着变化的,毕竟要继续循环使用spfa来更新下一条“能走的(看容量)”最短路。e[pre[i]^1].c += flow;ret += e[pre[i]].w * flow;}}return ret;
}

【最小费用最大流】知识点讲解相关推荐

  1. 最小费用最大流算法及题集

    貌似网上最小费用最大流的讲解的不多. 所谓最小费用最大流:就是在保证从源点 S 到汇点 T 的流量最大的前提下,使费用最小 这就在原先最大流问题的网络中,给每天边上新加上了费用,求得不在是最大流,而是 ...

  2. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  3. 网络流--最小费用最大流 (理解)

    1.什么是最小费用最大流问题 上篇文章我们讲解了最大流问题,那什么是最小费用最大流呢?听名字就可以看出,我们要在满足最大流的同时找到达成最大流的最小费用. 对于一个网络流,最大流是一定的,但是组成最大 ...

  4. 最小费用最大流及习题(poj)

    该算法讲解来源:https://www.cnblogs.com/gtarcoder/p/4890739.html 最小费用最大流 通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络 ...

  5. 有上下限的最小费用可行流

    例题 BZOJ 3876 题意,有N个点,并且有一些边,每个点必须要经过一次,但是不限经过次数,也就是有下界的情况,且下界为1,现在每次的起点都是1,问至少花费的代价,使得每次从1开始,终点不限的情况 ...

  6. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  7. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  8. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  9. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

最新文章

  1. Oracle 9i/10g/11g数据库升级路线图总览
  2. 摩根士丹利华鑫基金公司面试
  3. Leetcode232使用栈实现队列
  4. Elasticsearch 使用过程中有哪些坑?教你避开这些坑
  5. 《JavaScript高级程序设计》阅读笔记(七):ECMAScript中的语句
  6. [转] android获取手机信息大全
  7. Matlab 使用GPU加速 转载
  8. itil 容量管理流程_大项目定制,智能IT运营管理平台建设解决方案
  9. 机敏问答[博弈][0] #20210628
  10. 犀牛建立html格式,犀牛基础操作图文教程,教你rhino如何导出cad文件格式
  11. 国家社科基金项目清单、申报书填写指南和课题申报书模板
  12. 深度揭秘:诺基亚的百年沧桑
  13. Java实现“斐波那契数列”的方法(循环,递归,优化递归)
  14. Chromecast是什么
  15. Fibonacci数列(斐波那契数列)
  16. “信息系统灾难恢复方案设计”大赛
  17. ERP专业知识讲座:7.财务管理
  18. 编曲录音宿主软件-Cubase Elements 11 v11.0.30 WiN 元素版
  19. 基于FPGA的密码锁开发——(1)密码锁驱动
  20. 适合计算机专业的电脑配置,设计师电脑配置,真的要好好看清单

热门文章

  1. nginx - nginx的安装部署
  2. python调用PHP方法
  3. 神经机器翻译的前世今生--转自散文网
  4. FreeSWITCH背后的故事(译)
  5. 【hdu 1533】Going Home
  6. 关于H5的20道面试题及答案
  7. 电源系统该如何选择电容大小及数量
  8. XAMPP使用本地MySQL
  9. Mojave下修复搜狗输入法斗图和标点配对不生效的问题?
  10. 微信公众平台Js API WeixinApi