理解网络流中的反向弧

在刚学习网络流时,反向弧的概念困惑了我很久,因为在有向网中,弧或者边是有方向的,沿着弧的反方向推进流量虽然在计算上行得通,但是不理解这样做的意义。

由于手边的参考书籍主要侧重实践,对反向弧的用途并未进行过多解释,所以决定对反向弧一探究竟。

反向弧的意义

先说结论,一言以蔽之

为了获得最大流,而对之前流量的修正

通俗点讲就是反悔、悔棋。下面通过一个最大流求解过程来说明反向弧对流量的修正

反向弧流量修正栗子

如下图所示,A1为源点,A2为汇点。每条弧上的数字的含义是:第一个标识弧的容量,第二个表示弧当前的流量,图G中存在网络流f A1-A2-A3-A4,当前网络流f流量为1,在网络流f的基础上求图G的最大流。

我们使用最简单的Ford-Forkerson算法,执行如下步骤

  1. 首先从汇点执行BFS,标记弧<A1,A2>的可改进量为α=1(容量2减去流量1)
  2. 从A2出发,发现<A2,A3>已经满载,跳过弧<A2,A3>
  3. 从A2出发,发现<A2,A4>有剩余容量,选择min(f<A1,A2>,c<A2,A4>-f<A2,A4>) = 1

至此,找到一条增广路,对网络流改进如下图所示,增广链已经用红色字体标出

改进后的网络流f如下图所示,有1个单位的流量途径A1-A2-A4到达汇点,有1个单位的流量途径A1-A2-A3-A4到达汇点,当前流量为2。

当前网络流f还不是最大流,我们继续求解,下面再从源点开始第二轮的BFS,执行步骤如下

  1. 从汇点开始执行BFS,由于<A1,A2>已经满载,不再加入BFS队列,顶点A3入队,标记<A1,A3>可改进量α=2
  2. 这里我们来到了关键步骤,先按照规则计算流量,后面再做分析。这里从A3执行BFS时,发现到A4的弧已经满载,只能选择反向弧<A3,A2>,并推进1个单位的流量
  3. 最后从弧<A2,A4>,可以推进1单位的流量到汇点,至此,已求得网络G的最大流为3

第二次增广的路径如下图所示,增广链已经用红色标出

在第二次增广过程中,我们在弧<A2,A3>上进行了反向推进,下面深入分析一下步骤2的反向推进对网络流的影响。

关于第二轮增广步骤2的分析

根据定义,反向弧的容量 c 反 c_{反} c是其正向弧的流量 f 正 f_{正} f,这里反向弧<A3,A2>的容量为1,我们可以反向推进一个单位的流量,使得弧<A2,A3>的流量从1变为0。

你可能会想,我取消了弧<A2,A3>的流量,那弧<A3,A4>的1单位流量怎么办,岂不成了无源之水?

实际情况是,在弧<A2,A3>上反向推进的1单位流量,约束了此次查找到的增广路可改进量α肯定是小于等于1的。换言之,可以看做<A1,A3>接管了弧<A2,A3>推进到<A3,A4>的流量,并使原来<A2,A3>上的流量从顶点A2的其他路径流向汇点。仔细体会一下这个过程,就会豁然开朗。

最终图G的最大流如下图所示

结论

无论是基于BFS的Ford-Fulkerson算法,还是基于DFS的Dinic算法,每次查找到增广路,都是局部解(甚至不一定是局部最优解)。对之前流量不断修正,可以确保我们在多次增广过程中找到全局的最优解,这个修正过程是一定会有反向弧参与其中的。希望上面的例子对你理解反向弧有帮助,如果有任何疑问可以留言,我们一起探讨。

posted @   一只coding猪  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示