前言

在介绍如何使用dijkstra算法求解最小费用最大流问题的时候,假设看这篇博文的读者已经知道什么是最小费用最大流问题及熟悉dijkstra单源最短路径算法。在这篇博文里面,我并不会过多强调网络拓扑是有向图和无向图,因为对于无向图来说,你可以简单将其看成两个点之间有一对有向边的有向图。

经典求法

求解最大最小费用最大流经常有两种方式:
1. 每次求出一条费用最小费用的增广路径pp,将其加到当前费用流ff,得到更新后的费用流f′f',直到找不到增广路径为止
2. 先求网络的最大流fmaxf_{max},然后不停的遍历图移动费用流fmaxf_{max}的路径,使其费用降低,直到其费用不能降低为止。

使用dijkstra算法求解最小费用最大流网络使用的是第一种方式,对于第一种方式,网上的博客关于如何选择最小费用的增广路径的方式一般都是给出的SPFA(shortest path fast algorithm)方法。选择该方式有一定原因是在求最小费用最大流问题的时候,其反向边的权值是负权值,而该算法是基于经典的Bellman Ford算法优化的一种高效的可以用于求解负权值的算法。但是,其实这种方式就效率来说远远不及dijkstra算法,但为什么网上的博客中在介绍最小费用最大流算法的时候没有人介绍使用dijkstra算法了?因为dijkstra算法不能用于求解具有负权值的网络,所以他们觉得在这里dijkstra算法不适合。但是其实可以通过dijkstra算法去求解最小费用最大流网络。下面就来给出相关解释。

定义

为了说明算法的合理性,先给出一下定义:
对于两个点uu,vv,存在一个流ff从u经过v,不失一般性,我们将
f(u,v)f(u,v)方向的边定义为正向边,将f(v,u)f(v,u)方向的边定义为反向边,通常如果将正向边的权值定义为C(u,v)=cC(u,v) = c,反向边的权值将是C(v,u)=−cC(v,u) = -c。

合理性证明

能够使用dijkstra算法的前提基于以下几个前提
1.在最小费用最大流中,任何结点对(u,v)(u,v),始终只存在一个方向的流ff,该方向要不是从uu到vv,要不是vv到u<script type="math/tex" id="MathJax-Element-3835">u</script>。
2.在使用第一条方式求解最小费最大流算法时候,每次选择最小费用增广路径一定是当前残留图的最小增广路径。
3. 由于网络拓扑的费用和容量都是正值,而其反向边的存在是存在一定限制的,所以在网络中永远不可能有负环的存在。

让我先来说说第一点,如果一个结点对之间存在两个方向的流(对于无向图或有一对有向边的有向图),那么其一定不是最小费用最大流网络,因为在该结点对上的两个方向流是可以互相抵消的,肯定会存在一个两个方向互相抵消的更小费用的最大流网络。

第二点,我们在使用第一种方式的时候,每次选择的路径都必须是最小费用增广矩阵,这样才能保证我们最后得到的最小费用最大流网络

第三点,因为网络拓扑给的容量和费用都是正值,而只有当一条边有流量通过之后,才存在其反向边的概念,而其反向边的最用就是为了回流,其容量限制就是正向边的通过的流量,所以网络拓扑中不可能存在负环。

而dijkstra算法不能应用负权值网络是因为其使用的是贪心策略,所以导致对于有负权值的边有可能不会遍历。但是注意我们所说到的前提第二点和第三点。负权值反向边出现的条件是在正向边有流量通过,且我们每次选择最小费用的增广路径。而正因为两个限制弥补了dijkstra算法贪心策略的不足。大家自己画画图就可以理解了,所以这里我就不画图说明。

因此,正因为以上两条限制,所以完全可以使用dijkstra替换spfa来寻找最小费用最大流网络。

使用dijkstra求解最小费用最大流网络相关推荐

  1. matlab最小费用最大流函数,使用matlab求解最小费用最大流算问题

    <使用matlab求解最小费用最大流算问题>由会员分享,可在线阅读,更多相关<使用matlab求解最小费用最大流算问题(8页珍藏版)>请在人人文库网上搜索. 1.北京联合大学实 ...

  2. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

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

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

  4. 最小费用最大流算法 网络流

    最小费用最大流算法 图片来源 <趣学算法> 人民邮电出版社 陈小玉 代码实现 /* 参考:<趣学算法>陈小玉 人民邮电出版社 最小费用最大流---最小费用路算法 问题分析:在实 ...

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

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

  6. bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】

    第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...

  7. 网络最大流和最小费用最大流

    The Link of My Video Problem Link 网络最大流 Tip:括号内的文字为术语. 莱阳一中的同学要参加 NOI 啦.老师得到了一张交通图(网络),节点为城市, S S S ...

  8. 【最小费用最大流(改进Dijkstra)】2016 icpc 青岛 G - Coding Contest

    题目:https://vjudge.net/contest/412116#problem/G 题意:t组样例,n个点,每个点有sis_isi​个人和bib_ibi​份物资.m条边,每条边从第二次开始, ...

  9. 最大流最小费用java_最小费用最大流及算法

    最大流的网络,可看作为辅送一般货物的运输网络,此时,最大流问题仅表明运输网络运输货物的能力,但没有考虑运送货物的费用.在实际问题中,运送同样数量货物的运输方案可能有多个,因此从中找一个输出费用最小的的 ...

最新文章

  1. she's the one
  2. SAS数据挖掘实战篇【六】
  3. MVC4做网站后台:栏目管理1、添加栏目
  4. 分布式常见问题解决方案
  5. linux7.5进单用户模式,linux进入单用户模式
  6. 无需人工!无需训练!构建知识图谱 BERT一下就行了!
  7. springboot整合使用rocketMq
  8. 实验四报告 20135209潘恒 20135204郝智宇
  9. 剑指offer——面试题23:从上往下打印二叉树
  10. 识别图书ISBN号并输出查询结果的示例 | Marshal's Blog
  11. java自制语音识别,JAVA作的语音识别
  12. 怎么查微信公众号服务器,微信公众号查询数据库,微信公众号数据库怎么查询?...
  13. GB2312编码规则与代码实现
  14. java使用poi导出excel 包括多个工作簿
  15. scp 给ipv6_scp传输常用命令
  16. 微信悄悄新出了个野心很大的App
  17. 利用Xming X Server使用服务器上使用kettle
  18. 北京:外地社保卡可以在北京19家医院实现住院费用即时结算!
  19. mplab c30 注册方法
  20. LC链表(算法系列)

热门文章

  1. 调问开源问卷系统(DWSurvey)详细部署教程(手把手教程)
  2. 服务器驱动用什么工具_驱动、改向滚筒用什么胶板进行包胶?
  3. 最优化问题及其分类——决策变量、目标函数、约束条件
  4. 了解ACL及其配置方法
  5. 经典动画库 animate.css 的应用
  6. SV学习笔记—覆盖组及覆盖率数据采样方法
  7. 集中式版本管理系统和分布式管理系统的区别-集中式vs分布式
  8. 【2017年第2期】大数据的若干基础研究方向
  9. 数字电视的机顶盒通讯功能实现
  10. Java开发者必看避坑指南!人生转折!