网络最大流是网络流中最基础也是最重要的部分,后边的许多模型也都是由最大流问题引伸而来的html
在研究这个问题以前,让咱们先来学习一下前置知识算法
设$f(u,v)$表示边$(u,v)$的当前容量上限网络
设$c(u,v)$表示边$(u,v)$的最大容量上限性能
若是网络流图中的流量知足学习
则称该流为一个可行流优化
增广:即增长一条路径上的流量spa
增长一条路径的流量,即减小这条路径的当前流量上限,即$f(u,v)$的值3d
增广是咱们求解最大流的基础code
定义:在全部可行流中流量最大的流htm
那么咱们如何求解这个东西呢?
很显然的一种思路就是找到整个网络中的容量上限最小的边
增广(就是加流量)这条路径,不断的重复
暂且不说这么作时间复杂度如何
咱们先考虑一下它的正确性。
这么作貌似颇有道理,
可是!
以上图为例,如只是无脑增广的话,极可能对SABT这条边进行增广,而增广完这条边后,就再也没有能够增广的路径了,求出的最大流为$3$,下图为增广后的网络流图
很显然,这么作是错的,由于咱们能够分别增广$SAT$,$SBT$这两条路径,获得的流量为$6$
那怎么解决这个问题呢?
咱们须要引入一个很是重要的概念——反向边
例如,对于$SA$这条容量为$3$的边,咱们能够认为存在一条容量为$0$的边$AS$与之对应,对于$SA$进行增广,即减少它的容量上限,至关于增大$AS$的容量上限
也就是说,咱们容许从$SA$流出的流量倒流回去,给它一个悔改的机会
这样,对于上图而言,咱们能够借助反向边来更改本身的错误操做,创建反向边后的图以下图所示
这样咱们便又有了一条新的增广路$SBAT$,对这条路径进行增广后咱们即可以获得网络最大流为$5$
考虑一下,为何这样是对的?
缘由很简单,形成咱们刚开始作出错误决策的边为$AB$,最大流本不该通过这里,可是咱们却无脑的通过了这里
由于反向边$BA$的存在,咱们又把从$A$流向$B$的流量给退了回去。这就至关于没有通过$AB$这条边
(本节如下内容读者能够直接略过,属于本蒟蒻瞎扯,可能把读者带到沟里面,目前已有一人受害)
反向弧到这里本就应该结束了,可是本蒟蒻在学习的过程当中一直有个问题不明白
为何加反向弧是对的?
若是不考虑反向弧,咱们选择的路径为$SAT$,$SBT$,可是加了反向弧以后咱们的路径貌似不是这么选的啊。。
尤为是$AT$这条边的流量,本应该是从$SA$流过来,但实际是从$SB$流过来。
这样为何是对的呢?
这个问题我思考了很长时间,最终得出了一个很不靠谱的结论
由于通过$AB$这条边的流量为$SA,AB,BT$的最小值,而后xjb分状况讨论一下,%……&*()()*&……%¥)(大概要分个一二十种状况吧,而后发现都是对的,其实就是各边之间的流量等效替代问题。。。)
看到这儿的同窗,恭喜大家被带到坑里啦O(∩_∩)O哈哈~
我目前见过的最大流算法有如下几种
对于这些算法,博主给你们的建议是:
另外,在书上看到过听说可使用动态树优化最大流算法,可是把百度翻遍了也没找到代码。。。
若是您会的话欢迎教一下本蒟蒻,感激涕零
因为想讲的详细一些,因此想了一下把每一个算法分开讲吧,我会尽快更新哒:grinning:
(最近这几天可能不太好办了,由于博主在外面学(bei)习(nue),只有晚上才能更博客)