如何使用最大流量算法在图上找到最小割?

Posted

技术标签:

【中文标题】如何使用最大流量算法在图上找到最小割?【英文标题】:How can I find the minimum cut on a graph using a maximum flow algorithm? 【发布时间】:2011-05-27 20:20:36 【问题描述】:

我需要在图表上找到最小切割。我一直在阅读有关流网络的文章,但我能找到的只是最大流算法,例如 Ford-Fulkerson、push-relabel 等。鉴于最大流-最小切割定理,是否可以使用其中一种算法来找到使用最大流算法的图上的最小切割?怎么样?

到目前为止,我发现的最佳信息是,如果我发现“饱和”边缘,即流量等于容量的边缘,则这些边缘对应于最小切割。真的吗?这对我来说听起来不是 100% 正确的。确实,最小切割上的所有边缘都会饱和,但我相信也可能存在超出最小切割“路径”的饱和边缘。

【问题讨论】:

【参考方案1】:

从源顶点开始,沿着残差网络中的边(即非饱和边和有流动的边的后边)进行深度优先搜索,并标记所有可以通过这种方式到达的顶点。切割由从标记顶点到未标记顶点的所有边组成。显然,这些边缘是饱和的,因此没有被遍历。正如您所指出的,可能还有其他不属于最小切割的饱和边缘。

【讨论】:

我不确定我是否理解您的描述。在此图中:i.imgur.com/5TRQ0h2.png 我觉得您的算法说最小切割将删除 40/40 边缘和 50/50 边缘。 @NiklasB。我已经编辑了我的描述,希望更清楚。 这并不总是正确的,对于 DAG 来说它会很好。查看dingalapadum的答案 我应该在每个节点上做 DFS,还是只在源上做? 从源头上。【参考方案2】:

我不想挑剔,但建议的解决方案并不完全正确。

正确的解决方案:您实际上应该做的是 Residual-Network Gf (read it up on wikipedia) 上的 bfs/dfs 并标记顶点。然后你可以选择那些标记了 from-vertex 和 unmarked to-vertex。

为什么“遵循不饱和边缘”还不够: 考虑一下,流算法使边缘饱和,如图所示。我用绿色标记了我正在访问的顶点“仅遵循不饱和边缘”的方法。显然,唯一正确的最小切割是 E-F 的边缘,而建议的解决方案也将返回 A-D(甚至可能是 D-E)。

请注意,如果我们考虑残差网络,则 dfs/bfs 将访问顶点 D,因为从 E 到 D 会有一条边,从而使边 EF 成为唯一具有标记的起点和未标记的边到顶点。

【讨论】:

你不挑剔!上面的答案是错误的。谢谢。 这正是我想要的!残差图中 bfs/dfs 访问的 D 可能对其他人有用。 对于那些正在努力弄清楚为什么在残差图中访问与仅仅跟随残差边缘不同的人:饱和边缘并不意味着路径被阻塞,因为可能有来自相反方向的流动抵消了. 什么是bfs和dfs? @GZ92 我认为您的 maxflow 存在问题,因此您的残差网络也存在问题。中间和顶部顶点之间的边向下的容量为 10,向上的容量为 0。这意味着在原始无向图中,这条边的容量为 10。但是,maxflow 算法仍然可以将 5 个以上的流从源头推到通过这条边的汇点。 hth【参考方案3】:

所以,给出如何获得最小割的确切过程:

    运行 Ford-Fulkerson 算法以找到最大流量并获得残差图1在残差图上运行 BFS 以在残差图中找到从源可到达的顶点集(考虑到您不能在残差图中使用容量为 0 的边)。 重要提示:您必须在残差图中使用反向边来找到正确的可到达顶点集!!! (See this algorithm) 原始图中从可到达顶点到不可到达顶点的所有边都是最小割边。打印所有此类边缘。

1 边的容量定义为原始容量减去其流量(来自最大流量网络的流量)的图。

【讨论】:

感谢“从可到达顶点到不可到达顶点”的表述。【参考方案4】:

注意:Falk 的算法可用于找到具有最小顶点和最大顶点的最小割。对于后者,算法应该颠倒过来,即。从汇点而不是源点搜索。查看相关问题:Network Flow: Adding a new edge

【讨论】:

【参考方案5】:

一种理解方式是,让我们将割定义为两个集合 S 和 T,它们分别包括 s 和 t。

现在,将 S 中所有从 s 可到达的顶点添加到残差网络中,并将剩余的边放入 T 中。这将是一次切割。

其次,切割可以通过将所有从t可达的顶点放入残差网络中并将剩余的顶点放入S中来形成。

观看此视频,了解我们如何找到可从 s 和 t 到达的顶点。

https://www.youtube.com/watch?v=FIJaXfUIXJA&index=4&list=PLe-ggMe31CTduQ68XQ-sVj32wYJIspTma

【讨论】:

【参考方案6】:

计算出最大流量后,我们可以搜索边(u,v),使得在残差图中,在残差图中有一条边从vuf(v,u) = c(u,v)[表示边是饱和]

在筛选出这些边之后,我们可以使用残差图中不存在从 u 到 sink t 的路径的标准来选择这些边(u,v)。如果满足这个条件,那么这些边就构成了(S,T)cut的一部分

这个算法的运行时间可能是O(E) * O( V + E ) = O( E^2 )

【讨论】:

【参考方案7】:

我认为这是其他人所说的,但我发现不清楚,所以这是我的解释:

从源节点开始,对图进行泛洪填充,仅沿着具有剩余容量的边移动,标记每个访问过的顶点。您可以为此使用 DFS。回想一下,来自顶点的后边具有剩余容量 - 等于沿前边的流量(即 r(u, v) = 边 (u, v) 的剩余容量,r(v, u) = flow(u , v))。

实际上,这决定了图的 S-T 割的 S 部分。

最小切割现在将是一组边,这样一个顶点从上面的泛滥填充中标记出来,而另一个顶点没有标记。这些将是没有剩余容量的边(否则您会在 DFS 中遍历它们),并一起形成最小割。

去除这些边后,这组未标记的顶点将形成切割的 T 部分。

【讨论】:

以上是关于如何使用最大流量算法在图上找到最小割?的主要内容,如果未能解决你的问题,请参考以下文章

hdu 5889 Barricade最小割

网络流最大流

网络流基础-最大流最小割定理

[网络流]最大流模板

培训补坑(day3:网络流&最小割)

●小集训之旅 三