网络流在入门ing
推荐这个视频,之前生看书的话,知识储备存在断层,而这个UP则详细讲述了网络流的产生过程,没想到和线性规划还这么密切。
有空补档,方便自己回忆吧,建议完整看下视频。
----
主要是记录下自己看到的和理解吧,后面随着做题还会更正的。如有不严谨的地方还望大佬指正,谢谢!
首先介绍几个定义:
1.割:OI-WIKI的定义
绿导师的定义:
2.从s到t的不相交的路径:指从s到t的两条路径没有公共边
为了求从s->t的不相交路径,我们先考虑这样一个问题。
假设点集S包含了除了t以外其它所有点,点集T仅包含点t,那么此时从s->t的不相交路径数目的上界S-T的割数。
再极端到点集S仅包含s,T包含除了s以外所有点,那么s->t的不相交路径数目的上界也是此时S-T的割数。
所以s->t不相交路径数目的上界是所有S-T割的最小值。
下面再来看一下怎么求不相交路径的数目--Ford-Fulkerson方法。
对于这个图,我们找0->5的不相交路径数。显然,人可以很快看到两条[0-1-4-5]和[0-3-2-5].但是当DFS的时候有可能会出现[0-3-4-5]然后就只有一条了。面对这种情况该怎么办呢?
我们比较下两种情况选择走过的边,有没走的,有多走的。
我们可以发现,这种不正确的路径寻找以外,如果把它多走的这一条边反向的话,可以多产生[0-1-4-3-2-5]这一种走法。
对于s->t已经找到了这些路径,我们在下一次寻找的时候将路径反向,然后如果此时发现有某条路径是经过其中某个反向边的,那么我们可以对原来的路径进行改变,然后似乎就达成了一种后悔贪心的作用。
然后对于带权图,我们就把权重看作重边。
关于增广路径
残留网络:“用以纠正错误的新图,就是大家在各种网络资料上看到的残留网络”
在第三版的算法导论中,“之所以称其为‘方法’而不是‘算法’,是因为它包含了几种运行时间各不相同的具体实现。”所以我们通常使用的算法名称并不叫这个。
可以理解为流入“使用了f(u,v)条u->v的重边,总共有cuv条重边”。
接下来是和线性规划的关系。
我们为每个路径设置一个变量x1,x2,x3......表示过该路径的值(我理解是走了几次或者是走了几个重边)
要求max(x1+x2.....)
它满足下面的条件
过某一边的x1+x2+x3....<=c
//有多少边,就有多少个约数条件,有多少路径,就有多少x
这是一个求最大流的线性规划问题,它的对偶问题就是求最小割,emmm,这下最大流=最小割了。
最大流最小割定理:任何一个网络的最大流量等于最小割中边的容量之和。
求解算法:
Edmonds-Karp增广路算法:O(nm3) 处理1e3-1e4规模的网络
Dinic算法:O(m sqrt(n)) 处理1e4-1e5规模的网络
费用流:G=(V,E),每条边除了有容量限制c(x,y)以外,还有一个给定的“单位费用”w(x,y).花费是f(x,y)*w(x,y).分为”最小费用最大流“和“最大费用最大流”,合称费用流。
求解算法:
在Edmonds-Karp增广路算法的基础上改成每次用SPFA求一条单位费用之和最小的增广路。
-------------------------------------------
个性签名:曾经的我们空有一颗望海的心,却从没为前往大海做过真正的努力
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!