二分图对应流网络中FORD-FULKERSON算法增广路长度的上界问询
二分图对应流网络中FORD-FULKERSON算法增广路长度的上界问询
嘿,这个问题挺有意思的,咱们先从二分图对应的流网络结构说起,再一步步推导增广路的最长可能长度。
首先明确二分图转流网络的标准构造:
- 新增一个源点
s,连向二分图左部L的所有顶点,每条边容量为1; - 新增一个汇点
t,让二分图右部R的所有顶点连向t,每条边容量为1; - 保留二分图中原有的所有
L→R的边,每条边容量为1。
接下来看FORD-FULKERSON算法里的增广路——它是残量网络中从s到t的路径,且路径上所有边的残量容量都大于0。我们可以先排除带循环的增广路:因为如果路径里有循环,去掉循环后得到的路径依然是合法的增广路,而且更短,所以最长的增广路一定是简单路径(不重复经过任何顶点)。
那简单增广路的结构是什么样的?因为流网络里只有s→L、L↔R(正向是原二分图边,反向是残量边)、R→t这几类边,所以路径必然是交替经过L和R节点的序列:s → l₁ → r₁ → l₂ → r₂ → ... → l_k → r_k → t
这里的l_i都属于L,r_i都属于R,最后一定以R中的节点收尾(因为只有R节点能连到汇点t)。
现在推导两个实用的上界:
- 最紧上界:
2*min(|L|, |R|) + 1
路径里最多能包含min(|L|, |R|)个L节点和同等数量的R节点,加上源点s和汇点t,总边数就是2*min(|L|, |R|)+1。比如当二分图是完全二分图且|L|=|R|=m时,这条路径s→l₁→r₁→...→l_m→r_m→t的长度就刚好达到这个值。 - 通用上界:
|V| + 1
这里|V|是原二分图的顶点总数(|L|+|R|)。流网络总共有|V|+2个顶点,简单路径最多经过所有顶点一次,边数就是顶点数减1,也就是(|V|+2)-1=|V|+1。这个上界对所有二分图都成立,不用区分左右部的大小,适用性更广。
总结一下,如果你需要最精准的上界,选2*min(|L|, |R|)+1;如果想要一个不用额外区分左右部的通用上界,|V|+1就足够好用。
备注:内容来源于stack exchange,提问作者Lucy123




