找到最小切割的所有边缘

时间:2014-01-31 01:39:24

标签: algorithm network-flow minimum-cut

令(G,s,t,{c})为流动网络,并且令F为所有边e的集合,其中存在至少一个最小割(A,B),使得e从A变为B.给出一个多项式时间算法,找到F中的所有边。

注意:到目前为止,我知道我需要运行Ford-Fulkerson,因此每个边缘都有流量。此外,我知道F中的所有边,流f(e)= c(e)。然而,图表G中不是所有尊重该约束的边都将是最小切割。我被困在这里。

1 个答案:

答案 0 :(得分:2)

假设您已经在图G上计算了最大流量,并且您知道图中每条边的流量。从源顶点s,在原始图表上执行广度优先搜索深度优先搜索,并仅遍历流量小于边缘的容量。将此遍历中可到达的顶点集合表示为S,将不可到达的顶点表示为T

要获得最小切割C,我们只需查找原始图G中的所有边,这些边从S的某个顶点开始,到T的某个顶点结束

Topcoder中的

This tutorial提供了上述算法的解释/证明。请查看以下文字开头的部分:

  

流网络中的切口只是两个集合中顶点的分区,我们将它们称为A和B,使源顶点在A中,接收器在B中。

我将尝试提供Topcoder教程中相应部分的解释(仅供我详细介绍)。

现在,假设我们已经在图G上计算了最大流量,并且我们使用上面概述的过程计算了边集C。从这里,我们可以得出几个结论。

事实1:源顶点s必须设置为S,汇点t必须设置为T

否则,顶点st必须位于同一个集合中,这意味着我们必须找到从st的路径,该路径仅包含边流量小于容量。这意味着我们可以将更多流量从s推送到t,因此我们找到了一条增强路径!然而,这是一个矛盾,因为我们已经在图上计算了最大流量。因此,源顶点s和接收顶点t不可能连接,它们必须位于不同的集合中。

事实2:从集合S开始并以集合T结束的每条边都必须具有流量==容量

我们再次通过矛盾来证明这一点。假设u中有一个顶点Sv中有一个顶点T,那么剩余网络中的边(u,v) 流量小于容量。通过上面的算法,将遍历此边,并且顶点v应该在集合S中。这是一个矛盾。因此,这样的边缘必须具有flow == capacity。

事实3:从图C中移除G中的边将意味着集合S中的任何顶点都没有路径到集T <中的任何顶点/ H3>

假设情况并非如此,并且有一些边(u,v)将集合u中的顶点S连接到集合v中的顶点T 。我们可以将其分为两种情况:

  1. 通过边缘(u,v)的流量小于其容量。但我们知道这会导致顶点v成为集合S的一部分,所以这种情况是不可能的。
  2. 通过边缘(u,v)的流量等于其容量。这是不可能的,因为边(u,v)将被视为边集C的一部分。
  3. 因此,这两种情况都是不可能的,我们发现从原始图C中移除G中的边缘确实会导致从S到{{} {}} {1}}。

    事实4:原始图T中从顶点集G开始但在顶点集T处结束的每条边都必须具有S

    关于Topcoder教程的解释在第一次阅读时可能并不明显,以下是我的一个有根据的猜测,可能是不正确的。

    假设存在一些边0(其中(x,y)属于顶点集xT属于顶点集y),这样流过S的流量大于0.为方便起见,我们将(x,y)的流量表示为(x,y)。这意味着在剩余网络上,必须存在容量为f且流量为(y,x)的后向边f。由于顶点0是集合y的一部分,因此后边缘S具有容量为(y,x)的流0,我们的算法将遍历边f > 0并将顶点(y,x)放置为顶点集x的一部分。但是,我们知道顶点S是顶点集x的一部分,因此这是一个矛盾。因此,从TT的所有边都必须具有0的流。

    通过这4个事实以及Max-flow min-cut theorem,我们可以得出结论:

    1. 最大流量必须小于或等于任何切割的容量。事实3,S是图表的一个切割,因此最大流量必须小于或等于切割C的容量。

    2. 事实4使我们得出结论,CT没有“回流”。这与事实2一起意味着流程完全由从SS的“前向流”组成。特别是,所有前向流都必须来自切割T。该流量值恰好是最大流量。因此,通过Max-flow min-cut定理,我们知道C必须是最小切割。