所以我正在尝试通过this paper,主要是找到加权图的最小密集子图(在几何约束求解的上下文中)。
密集子图是边权重和顶点权重之和相等的子图。
作者解释说,这在某种程度上等同于最大流算法,因此他提出了标准最大流算法的变体,他说这对这个问题更有效。但是我对这些概念并不太熟悉,而且我发现实际的描述非常迟钝。也许有人可以帮助我吗?
算法如下:
我对第17步应该是什么,实际初始化流程以及增强过程如何工作感到困惑。
本文提供了一个例子:
所以我试图逐步完成这个例子,但我无法让它做到它应该做的事情。看起来第一次循环时,它会访问e1,v0和v2,并标记e0和e2。然后它访问e0并标记v2。然后它访问e2,但它的所有顶点都已被访问过,因此算法永远不会做任何事情。它是如何增加这条道路的呢?
提前致谢。
答案 0 :(得分:3)
它们不是 - 作者的疏忽。假设对于所有e和v,f e v 最初为零。
增强过程的工作原理步骤17明显高于其他常规程序。增加路径是最大流量的标准子主题,许多本科算法文本都将其涵盖。
让我们考虑流量问题,其中一切都有重量1.
a-->b
^
/
/
c-->d
我没有画出s
和t
。假设我们已将一个单位从c
推到b
。
a-->b
/
/
v
c-->d
从b
到c
的向后弧线显示是因为,虽然我们无法从绝对意义上将b
的流量发送到c
,但我们可以取消单位从c
到b
,在数学上具有相同的效果。最大流量值为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
应该是最大值,不会导致任何边缘产生超过其重量或任何顶点消耗超过其重量的值。