algorithm - 最大生成树找到覆盖每个循环的最小边集

标签 algorithm graph minimum-spanning-forest

我得到了以下任务:给定一个具有任意多个循环的图 G := (V, E)。最小边集是多少,以便对于图中的每个循环,该集中至少包含一条边 - 或者更准确地说,这些边的权重之和是多少。

我的方法非常简单:我计算了图上的最大生成森林,排除了每条边,并宣布剩余边作为结果。这个想法如下:由于每个生成树都没有循环,所以我永远不会删除整个循环,因此不会有任何我没有涵盖的循环。此外,我也无法删除图 G 中的任何其他边,因为如果我这样做,我将删除一个循环,因此结果不会涵盖所有循环。因此我断定我的方法是正确的。

不过好像不是这样的。任何人都可以启发我哪里出错了吗?我想不出一个反驳我的方法的例子。

最佳答案

这可以解决为 set covering problem .

索引弧 1...m。令j指代任意弧。

索引循环 1...n。让我指的是任意循环。

如果第 j 个弧是第 i 个循环的一部分,则指示变量 a_{ji} = 1。 0 否则。

如果第 j 个弧被选为您的解决方案的一部分,则令 x_j = 1。

您想尽量减少选择的圆弧数。

因此,最小化\sum_{j=1}^{m} x_j

约束是您选择的弧应该覆盖所有循环。

特别地,对于任何循环 i,您希望至少选择它的一条边。

因此,按如下方式建模。

对于每个 i,\sum_{j=1}^{m} a_{ji}x_{j} >= 1。

将有 n 个这样的约束,每个 i 一个。

另一个约束是每个 x_{j} 要么是 0 要么是 1。

如果你正在寻求解决加权版本,那么给定弧 j 的权重为 c_j,目标需要更改为

\sum_{j=1}^{m} c_j x_j

关于algorithm - 最大生成树找到覆盖每个循环的最小边集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238530/

相关文章:

java - 在计算器程序中实现模运算符

algorithm - 计算算法的时间复杂度

c++ - 加扰输入算法的效率

c++ - 插入一个元素到柠檬图库 map 而不复制

arrays - 当Cypher中数组的元素大于零时,我如何计算它们?

algorithm - 删除后使图不再连通的最小顶点数

algorithm - 使用什么算法来找到最小生成森林?

algorithm - 在固定容量中找到所有可能的段平铺