令(G,s,t,{c})为流动网络,并且令F为所有边e的集合,其中存在至少一个最小割(A,B),使得e从A变为B.给出一个多项式时间算法,找到F中的所有边。
注意:到目前为止,我知道我需要运行Ford-Fulkerson,因此每个边缘都有流量。此外,我知道F中的所有边,流f(e)= c(e)。然而,图表G中不是所有尊重该约束的边都将是最小切割。我被困在这里。
答案 0 :(得分:2)
假设您已经在图G
上计算了最大流量,并且您知道图中每条边的流量。从源顶点s
,在原始图表上执行广度优先搜索或深度优先搜索,并仅遍历流量小于边缘的容量。将此遍历中可到达的顶点集合表示为S
,将不可到达的顶点表示为T
。
要获得最小切割C
,我们只需查找原始图G
中的所有边,这些边从S
的某个顶点开始,到T
的某个顶点结束
This tutorial提供了上述算法的解释/证明。请查看以下文字开头的部分:
流网络中的切口只是两个集合中顶点的分区,我们将它们称为A和B,使源顶点在A中,接收器在B中。
我将尝试提供Topcoder教程中相应部分的解释(仅供我详细介绍)。
现在,假设我们已经在图G
上计算了最大流量,并且我们使用上面概述的过程计算了边集C
。从这里,我们可以得出几个结论。
s
必须设置为S
,汇点t
必须设置为T
。否则,顶点s
和t
必须位于同一个集合中,这意味着我们必须找到从s
到t
的路径,该路径仅包含边流量小于容量。这意味着我们可以将更多流量从s
推送到t
,因此我们找到了一条增强路径!然而,这是一个矛盾,因为我们已经在图上计算了最大流量。因此,源顶点s
和接收顶点t
不可能连接,它们必须位于不同的集合中。
S
开始并以集合T
结束的每条边都必须具有流量==容量我们再次通过矛盾来证明这一点。假设u
中有一个顶点S
,v
中有一个顶点T
,那么剩余网络中的边(u,v)
流量小于容量。通过上面的算法,将遍历此边,并且顶点v
应该在集合S
中。这是一个矛盾。因此,这样的边缘必须具有flow == capacity。
C
中移除G
中的边将意味着集合S
中的任何顶点都没有路径到集T
<中的任何顶点/ H3>
假设情况并非如此,并且有一些边(u,v)
将集合u
中的顶点S
连接到集合v
中的顶点T
。我们可以将其分为两种情况:
(u,v)
的流量小于其容量。但我们知道这会导致顶点v
成为集合S
的一部分,所以这种情况是不可能的。(u,v)
的流量等于其容量。这是不可能的,因为边(u,v)
将被视为边集C
的一部分。因此,这两种情况都是不可能的,我们发现从原始图C
中移除G
中的边缘确实会导致从S
到{{} {}} {1}}。
T
中从顶点集G
开始但在顶点集T
处结束的每条边都必须具有S
关于Topcoder教程的解释在第一次阅读时可能并不明显,以下是我的一个有根据的猜测,可能是不正确的。
假设存在一些边0
(其中(x,y)
属于顶点集x
而T
属于顶点集y
),这样流过S
的流量大于0.为方便起见,我们将(x,y)
的流量表示为(x,y)
。这意味着在剩余网络上,必须存在容量为f
且流量为(y,x)
的后向边f
。由于顶点0
是集合y
的一部分,因此后边缘S
具有容量为(y,x)
的流0
,我们的算法将遍历边f > 0
并将顶点(y,x)
放置为顶点集x
的一部分。但是,我们知道顶点S
是顶点集x
的一部分,因此这是一个矛盾。因此,从T
到T
的所有边都必须具有0的流。
通过这4个事实以及Max-flow min-cut theorem,我们可以得出结论:
最大流量必须小于或等于任何切割的容量。事实3,S
是图表的一个切割,因此最大流量必须小于或等于切割C
的容量。
事实4使我们得出结论,C
到T
没有“回流”。这与事实2一起意味着流程完全由从S
到S
的“前向流”组成。特别是,所有前向流都必须来自切割T
。该流量值恰好是最大流量。因此,通过Max-flow min-cut定理,我们知道C
必须是最小切割。