找到最小割中的所有边

2024-03-11

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

注意:到目前为止,我知道我需要运行 Ford-Fulkerson,以便每个边缘都有一个流程。此外,我知道对于 F 中的所有边,流 f(e) = c(e)。然而,并非图 G 中遵守该约束的所有边都将处于最小切割中。我被困在这里了。


假设您已经计算了图表上的最大流量G并且您知道图中每条边的流量。从源顶点s,执行一个广度优先搜索 OR 深度优先搜索在原始图上,只遍历那些有流的边少于边缘的容量。将本次遍历中可到达的顶点集表示为S,以及不可到达的顶点T.

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

在Topcoder中提供了上述算法的解释/证明。查看以以下文本开头的部分:

流网络中的切口只是将顶点划分为两个集合,我们将它们称为 A 和 B,这样源顶点在 A 中,汇点在 B 中。

我将尝试在 Topcoder 教程中提供相应部分的解释(也只是为了让我温习一下)。

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

事实 1:源顶点s必须在集合中S,和汇点t必须在集合中T.

否则,顶点s and t必须在同一个集合中,这意味着我们必须找到一条来自s to t仅由流量小于容量的边组成。这意味着我们可以从s to t,因此我们找到了一条增广路!然而,这是一个矛盾,因为我们已经计算了图上的最大流量。因此,源顶点不可能s和汇点t要连接,并且它们必须位于不同的集合中。

事实 2:每条边都从 set 开始S并在设定时结束T必须有流量==容量

我们再次用反证法证明这一点。假设有一个顶点u in S和一个顶点v in T,这样边(u,v) in the 残差网络流量小于容量。通过我们上面的算法,这条边将被遍历,并且顶点v应该在集合中S。这是一个矛盾。因此,这样的边必须具有流量==容量。

事实 3:去除边缘C从图G意味着集合中没有任何顶点的路径S到集合中的任意顶点T

假设情况并非如此,并且存在一些边缘(u,v)连接顶点u in set S到顶点v in set T。我们可以将其分为两种情况:

  1. 流过边缘(u,v)小于其容量。但我们知道这会导致顶点v成为集合的一部分S,所以这种情况是不可能的。
  2. 流过边缘(u,v)等于其容量。这是不可能的,因为边缘(u,v)将被视为边缘集的一部分C.

因此这两种情况都是不可能的,我们看到删除边缘C从原始图表G确实会导致无路可走的情况S to T.

事实 4:原始图中的每条边G从顶点集开始T但结束于顶点集S必须有流量0

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

假设存在一些边(x,y) (where x属于顶点集T and y属于顶点集S),使得流过(x,y)大于0。为了方便起见,我们将流过的流量表示为(x,y) as f。这意味着在残差网络,必须存在后向边缘(y,x)有能力f和流动0。由于顶点y是集合的一部分S, 后边缘(y,x)有流量0有能力f > 0,我们的算法将遍历边缘(y,x)并放置顶点x作为顶点集的一部分S。然而,我们知道顶点x是顶点集的一部分T,因此这是一个矛盾。因此,所有边都来自T to S流量必须为0。

有了这 4 个事实,再加上最大流最小割定理 http://en.wikipedia.org/wiki/Max-flow_min-cut_theorem,我们可以得出结论:

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

  2. 事实 4 让我们得出结论,不存在“回流”T to S。这与事实 2 一起意味着该流量完全由来自以下位置的“前向流量”组成:S to T。特别是,所有向前流动必须由切割产生C。该流量值恰好是最大流量。因此,根据最大流最小割定理,我们知道C必须是最小割。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到最小割中的所有边 的相关文章

  • Kamada 和 Kawai 图形布局算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人尝试过 Kamada Kawai 的 88 算法来绘制一般无向图吗 如果是这样 并且您知道其中的任
  • 算法的最佳、最差和平均情况运行时间是多少?

    算法的最佳 最差和平均情况运行时间是多少 用最简单的术语来说 对于输入大小为n 最好的情况 最快完成时间 选择最佳输入 例如 排序算法的最佳情况是已经排序的数据 最坏的情况下 完成最慢的时间 选择了消极的输入 例如 排序算法的最坏情况可能是
  • 贪心算法的使用示例?

    贪心算法有什么用 一个真实的例子 最小生成树 Prim http en wikipedia org wiki Prim s algorithm的算法和克鲁斯卡尔的 http en wikipedia org wiki Kruskal s a
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在
  • 以与版本页面上相同的方式区分两个字符串的算法是什么?

    我正在尝试按短语区分两个字符串 类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式 执行此操作的算法是什么 是否有 gems 或其他标准库可以实现此目的 编辑 我见过其他比较算法 Differ http github
  • 生成非连续组合

    我正在尝试创建一个生成器 支持执行 next 的迭代器 可能在 python 中使用yield 它给出来自 1 2 n n 和 r 是参数 的 r 元素的所有组合 这样在选出的r个元素 没有两个是连续的 例如 对于 r 2 且 n 4 生成
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 无痛“算法分析”培训? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学时曾有过一次关于 算法分析 课程的痛苦经历 但最近发现在大学中需要它真实世界 无论如何 我正在
  • 算法:最大计数器

    我有以下问题 您有 N 个计数器 最初设置为 0 并且您对它们有两种可能的操作 increase X 计数器 X 加 1 max counter 所有计数器都设置为任何计数器的最大值 给出一个包含 M 个整数的非空零索引数组 A 该数组代表
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 二进制字符串到十进制字符串

    下午好 如何将字符数多于语言最大整数类型中位数的二进制字符串转换为十进制字符串 换句话说 假设你有字符串 111001101001110100100 1001001111011100100 并且您不能先将其转换为整数 那么您将如何以 10
  • 添加到数组连续数字

    这是我向SO提出的第一个问题 我希望能答对 在 PHP 中 如果你不会 Python 或伪语言也可以 给定一个包含 n 个元素的数组 old array 1 2 3 5 7 8 9 20 21 23 29 我需要向新数组添加连续数字 如果不
  • 当目标是查找某个字符串的所有出现情况时,KMP 最坏情况的复杂度是多少?

    我还想知道哪种算法在查找另一个字符串中所有出现的字符串时具有最坏情况的复杂性 博耶 摩尔算法似乎具有线性时间复杂度 KMP 算法在查找字符串中所有出现的模式时具有线性复杂度 如 Boyer Moore 算法1 如果您尝试在 aaaaaaaa
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d

随机推荐