我需要在图表上找到最小切割。我一直在阅读关于流网络的内容,但我能找到的是最大流算法,如Ford-Fulkerson,push-relabel等。鉴于最大流量最小切割定理,是否可以使用其中一种算法来查找使用最大流算法在图表上的最小割数?怎么样?
到目前为止我发现的最好的信息是,如果我发现“饱和”边缘,即流量等于容量的边缘,那些边缘对应于最小切割。真的吗?这对我来说听起来不是100%。确实,最小切口上的所有边缘都会饱和,但我相信也可能存在饱和边缘,这些边缘超出了最小切割“路径”。
答案 0 :(得分:45)
从源顶点开始,沿着剩余网络中的边缘进行深度优先搜索(即,具有流的边缘的非饱和边缘和后边缘),并标记可以通过这种方式到达的所有顶点。切割包括从标记顶点到未标记顶点的所有边。显然,这些边缘是饱和的,因此没有遍历。如您所述,可能还有其他饱和边缘不属于最小切割。
答案 1 :(得分:26)
我不想挑剔,但建议的解决方案不太合适。
正确的解决方案:您实际应该做的是 Residual-Network Gf (read it up on wikipedia)上的bfs / dfs并标记顶点。然后你可以选择带有标记的从顶点和未标记到顶点的那些。
为什么'追踪不饱和边'不够: 考虑一下,流算法使边缘饱和,如图所示。我用绿色标记了“正在跟随不饱和边缘”的方法我正在访问的顶点。很明显,唯一正确的最小切割是来自E-F的边缘,而建议的解决方案也会返回A-D(甚至可能是D-E)。
请注意,如果我们考虑使用残差网络,dfs / bfs将访问顶点D,因为从E到D会有一条边,从而使边EF成为唯一一个带有标记的从顶点和未标记的边。到顶点。
答案 2 :(得分:1)
注意:Falk的algorythm可用于查找具有最小顶点和最大顶点的最小切割。对于后者,algorythm应该颠倒,即。从接收器顶点而不是源搜索。请参阅相关问题:Network Flow: Adding a new edge
答案 3 :(得分:1)
要理解的一种方法是,让我们将切割定义为两组S和T,它们分别包括s和t。
现在,添加S中可从残差网络中的s到达的所有顶点,并将剩余边缘放入T.这将是一次切割。
其次,可以通过将所有顶点放在T中,从残余网络中的t到达,并将剩余的顶点放在S中来形成剪切。
看看这个视频,看看我们如何找到从s和t可以到达的顶点。
https://www.youtube.com/watch?v=FIJaXfUIXJA&index=4&list=PLe-ggMe31CTduQ68XQ-sVj32wYJIspTma
答案 4 :(得分:1)
所以,要给出如何获得最小切割的确切程序:
1 图表,其中边缘的容量被定义为它的原始容量减去其流量(来自最大流量网络的流量)。
答案 5 :(得分:0)
在计算最大流量后,我们可以搜索边(u,v)
,这样在残差图中,残差图中有一条从v
到u
和{{1}的边} [表示边缘已饱和]
在对这些边进行短名单后,我们可以通过使用在残差图中没有从u到下沉t的路径的标准来选择这样的边f(v,u) = c(u,v)
。如果满足此条件,则此类边缘构成(u,v)
cut
此算法的运行时间可能为(S,T)
答案 6 :(得分:0)
我认为这是其他人所说的,但我发现它不清楚所以这是我的解释:
从源节点进行图形的泛洪填充,仅沿剩余容量的边缘行进,标记每个访问的顶点。您可以使用DFS。回想一下,来自顶点的后边缘有剩余容量 - 等于沿前沿的流量(即r(u,v)=边缘的剩余容量(u,v),r(v,u)=流量(u) ,v))。
实际上,这决定了图表的S-T切割的S部分。
现在,最小切割将是一组边缘,以便从上面的洪水填充中标记一个顶点,而不标记另一个顶点。这些将是没有剩余容量的边缘(否则你会在你的DFS中遍历它们),并且一起形成最小切割。
删除这些边后,未标记的顶点集将形成切割的T部分。