Boykov-Kolmogorov算法反向弧负流含义及Boost示例疑问
关于Boost Boykov-Kolmogorov示例修改后的问题解答
问题1:为何出现重复弧与0/负流值
注释掉if (capacity[*ei] > 0)后,代码会遍历节点的所有出边,包括残差网络中的反向弧。Boost的最大流实现中,每条原始正向边都会对应一条反向残差边:
- 原始的6->4边如果未被分配流,其流值为0,会被输出为
f 6 4 0; - 而如果存在4->6的正向流(比如4单位),残差网络中会自动生成6->4的反向弧,其流值为-4(表示可以“撤销”4单位的4->6流),遍历6的出边时这条反向弧也会被输出,就出现了
f 6 4 -4。
两者属于残差网络中不同的边对象,只是起点终点相同,所以看起来是重复弧。
问题2:节点净流入与负流的解读
- Boykov-Kolmogorov算法严格保证除源点和汇点外,所有节点的净流入为0,这是流网络的基本守恒性质,算法实现不会违背这一点。
- 示例中
7->6 -4的负流,本质是残差网络反向弧的流值表示:它对应正向弧6->7上有4单位的流,反向弧的负流用来记录“可以从7向6推送最多4单位的反向流”(也就是撤销原6->7的流)。实际流的方向是6→7,流量4;负流只是残差网络的内部表示,不是实际的反向流动。
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

