You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

二分图对应流网络中FORD-FULKERSON算法增广路长度的上界问询

二分图对应流网络中FORD-FULKERSON算法增广路长度的上界问询

嘿,这个问题挺有意思的,咱们先从二分图对应的流网络结构说起,再一步步推导增广路的最长可能长度。

首先明确二分图转流网络的标准构造:

  • 新增一个源点s,连向二分图左部L的所有顶点,每条边容量为1;
  • 新增一个汇点t,让二分图右部R的所有顶点连向t,每条边容量为1;
  • 保留二分图中原有的所有L→R的边,每条边容量为1。

接下来看FORD-FULKERSON算法里的增广路——它是残量网络中从st的路径,且路径上所有边的残量容量都大于0。我们可以先排除带循环的增广路:因为如果路径里有循环,去掉循环后得到的路径依然是合法的增广路,而且更短,所以最长的增广路一定是简单路径(不重复经过任何顶点)。

那简单增广路的结构是什么样的?因为流网络里只有s→LL↔R(正向是原二分图边,反向是残量边)、R→t这几类边,所以路径必然是交替经过LR节点的序列:
s → l₁ → r₁ → l₂ → r₂ → ... → l_k → r_k → t
这里的l_i都属于Lr_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

火山引擎 最新活动