难以理解用于几何约束求解的伪代码最大流算法

时间:2011-11-04 16:56:19

标签: algorithm graph

所以我正在尝试通过this paper,主要是找到加权图的最小密集子图(在几何约束求解的上下文中)。

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

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

算法如下: Image 1 Image 2

我对第17步应该是什么,实际初始化流程以及增强过程如何工作感到困惑。

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

所以我试图逐步完成这个例子,但我无法让它做到它应该做的事情。看起来第一次循环时,它会访问e1,v0和v2,并标记e0和e2。然后它访问e0并标记v2。然后它访问e2,但它的所有顶点都已被访问过,因此算法永远不会做任何事情。它是如何增加这条道路的呢?

提前致谢。

1 个答案:

答案 0 :(得分:3)

实际初始化流程的

它们不是 - 作者的疏忽。假设对于所有e和v,f e v 最初为零。

增强过程的工作原理步骤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,从b取消一个单元到c,将一个单元从c推到d }。

这是步骤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应该是最大值,不会导致任何边缘产生超过其重量或任何顶点消耗超过其重量的值。