algorithm - 无法理解用于几何约束求解的伪代码最大流算法

标签 algorithm graph

所以我正在努力解决 this paper ,这主要是关于找到加权图的最小密集子图(在几何约束求解的上下文中)。

稠密子图是边权重之和与顶点权重之和相等的子图。

作者解释说,这在某种程度上等同于最大流算法,因此他提出了标准最大流算法的变体,他说这种算法对于这个问题更有效。但是我对这些概念不太熟悉,而且我发现实际描述非常晦涩。也许有人可以帮我解决这个问题?

算法表述如下: Image 1 Image 2

我对第 17 步应该是什么、流程实际初始化的位置以及增强过程的工作方式感到非常困惑。

论文提供了一个例子: Image 3

因此,我尝试逐步执行该示例,但我无法让它执行预期的操作。好像第一次循环时,它访问了 e1、v0 和 v2,并标记了 e0 和 e2。然后它访问 e0 并标记为 v2。然后它访问 e2,但是它的所有顶点都已经被访问过,所以该算法什么都不做。它如何增加路径?

提前致谢。

最佳答案

流实际初始化的地方它们不是 – 作者的疏忽。假设对于所有 e 和 v,fev 最初为零。

增强过程的工作原理 第 17 步明显高于例程的其余部分。增广路径是最大流的标准子主题,许多本科算法课本都涵盖了这一主题。

让我们考虑一个所有权重都为 1 的流问题。

a-->b
   ^
  /
 /
c-->d

我还没有绘制st。假设我们已将一个单元从 c 推到 b

a-->b
   /
  /
 v
c-->d

bc 的反向弧出现是因为,虽然我们不能将流从 b 发送到 c 在绝对意义上,我们可以取消从 cb 的一个单元,这在数学上具有相同的效果。最大流的值为 2,我们通过增加路径 a -> b -> c -> d 来实现。这只是意味着从 a 推一个单元到 b,从 c 取消一个单元到 b,推一个单位从 cd

这是第 17 步的一些伪代码。

Augment(vert, pred, amount)
  v = vert
  while true
    e = pred(v)
    f_e^v += amount
    if pred(e) is null
      break
    v = pred(e)
    f_e^v -= amount

amount 应该是不会导致任何边产生超过其权重或任何顶点消耗超过其权重的最大值。

关于algorithm - 无法理解用于几何约束求解的伪代码最大流算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012991/

相关文章:

algorithm - MatLab - 牛顿法算法

c++ - 算法 - 具有最近路径前缀回退的查找树

c++ - 寻找树中最小值的路径

iphone - 制作一个没有核心图的简单线图

algorithm - 无爪图

algorithm - 给定一组范围 S 和一个重叠范围 R,找到 S 中包含 R 的最小子集

algorithm - 检测几乎已排序的数组中的未排序元素

java - 为 Java Graph 类实现间接连接测试

c++ - 图数据结构的良好内存管理策略

r - 如何在plot_ly r 图中使用数值变量作为字符