假设您已经在图G上计算了最大流,并且您知道图中每条边上的流量。从源顶点s开始,在原始图上执行广度优先搜索或深度优先搜索,并仅遍历那些流量小于边容量的边。将此遍历中可到达的顶点集称为S,不可到达的顶点称为T。
要获取最小割C,我们只需找到原始图G中所有起点位于S中,终点位于T中的边。
Topcoder中的
本教程提供了上述算法的解释/证明。请查看以下文本开头的部分:
“流网络中的切割只是将两个集合中的顶点分成A和B,使得源顶点在A中,汇顶点在B中。”
我将尝试解释Topcoder教程中的相应部分(仅供我自己复习)。
现在,假设我们已经在图G上计算出最大流,并使用上述过程计算出边集C。从这里,我们可以得出几个事实。
事实1:源顶点s必须在集合S中,汇顶点t必须在集合T中。
否则,顶点s和t必须在同一集合中,这意味着我们必须找到一条从s到t的路径,该路径仅由流量小于容量的边组成。这意味着我们可以从s向t推送更多的流量,因此我们已经找到了增广路径!但是,这是一个矛盾,因为我们已经在图上计算出了最大流。因此,不可能连接源顶点s和汇顶点t,并且它们必须在不同的集合中。
事实2:从集合S
开始并以集合T
结束的每条边都必须具有流量==容量
同样,我们通过反证法来证明这一点。假设在S
中有一个顶点u
,在T
中有一个顶点v
,使得在剩余网络中,边(u,v)
的流量小于容量。根据我们上面的算法,将遍历此边,并且顶点v
应该位于集合S
中。这是一个矛盾。因此,这样的边必须具有流量==容量。
事实3:从图G
中删除C
中的边将意味着从集合S
中的任何顶点到集合T
中的任何顶点都没有路径
假设不是这种情况,并且存在某个边(u,v)
连接集合S
中的顶点u
和集合T
中的顶点v
。我们可以将其分为两种情况:
- 通过边缘
(u,v)
的流量小于其容量。但我们知道这将导致顶点 v
成为集合 S
的一部分,因此这种情况是不可能的。
- 通过边缘
(u,v)
的流量等于其容量。这是不可能的,因为边缘 (u,v)
将被视为边缘集合 C
的一部分。
因此,两种情况都是不可能的,我们可以看到从原图 G
中删除边缘集合 C
将确实导致不存在从 S
到 T
的路径。
事实4:原始图 G
中从顶点集 T
开始但结束于顶点集 S
的每条边必须具有流量为 0
Topcoder 教程中的解释可能在第一次阅读时并不明显,以下是我个人的猜测,可能不正确。
假设存在一条边
(x,y)
(其中
x
属于顶点集合
T
,
y
属于顶点集合
S
),使得通过
(x,y)
的流量大于0。为方便起见,我们将通过
(x,y)
的流量表示为
f
。这意味着在
剩余网络上,必须存在一条容量为
f
,流量为
0
的反向边
(y,x)
。由于顶点
y
是集合
S
的一部分,反向边
(y,x)
的流量为
0
,容量为
f>0
,因此我们的算法将遍历边
(y,x)
并将顶点
x
作为顶点集合
S
的一部分。然而,我们知道顶点
x
是顶点集合
T
的一部分,因此这是一个矛盾。因此,从
T
到
S
的所有边都必须具有流量为0。
有了这4个事实,加上
最大流最小割定理,我们可以得出以下结论:
1. 最大流必须小于或等于任何割的容量。根据事实3,
C
是图的一个割,因此最大流必须小于或等于割
C
的容量。
2. 事实4使我们得出结论,从
T
到
S
没有“回流”。这与事实2意味着流量完全由
S
到
T
的“正向流”组成。特别地,所有正向流都必须来自割
C
。这个流量值恰好是最大流。因此,根据最大流最小割定理,我们知道
C
必须是最小割。