1 网络流定义
s称为发点(源)
t称为收点(汇)
1.1 s-t 流
f的value也等于流入f的f(e)的总和
s-t流又称为可行流
2 最大流问题
找到满足capacity和flow conservation 两个条件的流的最大值
2.1 s-t 割
注意:s一定属于A,t一定属于B
注:只考虑A到B的边,不考虑B到A的边
以上图为例,capacity是10+8+10=28
2.2 最小割问题:
找到各个割(cut)中,最小的capacity
2.3 最大流问题尝试:贪心算法
我们先试一下贪心算法,看看可不可行
还是以这张图为例:
这时候,通过贪心算法,我们得到的“最大流“是16
但是,我们会发现,这个图中的最大流是 19
所以贪心法显然不行
2.4 最大流问题:贪心法拓展
2.4.1 两个场景
我们在贪心法的基础上,考虑别的场景
Scenario 1 是前面贪心算法考虑的路径,只有前向传播的边。这个我们也保留。
在此基础上,我们考虑反向边。
这个场景也是满足flow conservation条件的
综合一下,我们有:
2.4.2 残差图
2.4.3 增广路径 augmenting path
2.4.4 Ford-Fulkerson Algorithm
2.4.5 Ford-Fulkerson Algorithm 举例
还是以这张图为例:
到这一步还是和前面的贪心是一样的(前面的贪心到这里就结束了
我们先构建此时的residual graph
然后发现s->b->a->c->t是一条增广路径,且其中的bottleneck是2。
于是进行路径增广:
然后再更新residual graph(标蓝的这几个方向或者数值发生了改变)
(此时的val不是16,是18)
此时会有路径s->b->d->a->c->t 。其中 bottleneck为1
然后我们再更新残差图,发现已经没有增广路径了。 算法结束
对照我们之前说的最大流19,发现是一样的
3 流和割之间的关系 :flow value lemma
蓝色的表示流出A的,黄色的表示流入A的,他们的差就是val(f)
3.1 证明
3.2 弱相关性
3.3 最大流&最小割 定理
证明: (1推2,2推3,3推4)
因为 val(f)都是小于等于cap(A,B)的,而这里取等了。所以此时的f是最大流
如果有增广路径的话,Ford-Fulkerson Algorithm 就可以继续进行。网络流还可以继续增加。
所以此时不是最大流
4 Ford-Fulkerson algorithm的时间复杂度
这个记结论吧 O(mnC)。 但是这个和斐波那契数列那时候的情况一样,不是一个多项式级的算法。(因为输入的size是m,n,logC)
4.1 算法的改进
我们需要合理地找一条合适的增广路径,使得:
(1)可以有效地找到这条增广路径
(2)算法迭代次数少
4.1.1 找有最多(或者近似于最多)bottleneck capacity 的增广路径
时间复杂度降至
4.1.2 最短增广路径
(1)在整个算法的过程中,最短路径的长度不减
(2)在最多m次路径增广之后,最短增广路径的长度严格增加
最短增广路径算法的时间复杂度降至