如何在无向图中查找反馈边集

时间:2012-05-29 00:11:50

标签: algorithm graph kruskals-algorithm

设G =(V,E)是无向图。边的集F FE称为a 如果G的每个周期在F中至少有一个边缘,则反馈边缘设置

(a)假设G未加权。设计一种有效的算法来查找 最小尺寸反馈边集。

(b)假设G是具有正边权重的加权无向图。 设计一种有效的算法来找到最小权重反馈边集。


我的解决方案(需要建议):

a)最小尺寸反馈边集:由于图表未加权,我们可以使用DFS。我们像往常一样从任何顶点开始DFS。当我们遇到后边缘时,我们将其插入一组反馈边缘。当DFS完成时,该集将是答案。

b)最小权重反馈边集:由于图表是加权的,我们可以使用Kruskal。但Kruskal通常以最小重量的边缘开始。如果我们可以否定所有边权重,然后运行Kruskal,每当我们在相同组件的顶点之间获得边缘时,我们可以将其保存在反馈边集中。最后,否定边权重。我建议否定边权重的原因是因为我们需要最小权重反馈集。在负重量的情况下,Kruskal将从具有最小重量(实际上最大)的边缘开始,并且将找到具有较小重量的相同部件的边缘。

有人可以判断这个解决方案是否正确吗?

5 个答案:

答案 0 :(得分:5)

是的,您的解决方案是正确的。最小权重反馈边缘集的无向图是最大权重跨越森林的补充。所有跨越森林都具有相同的基数,因此在未加权的情况下,任何跨越森林(由DFS找到)都可以。 (证明草图:拟阵。)

反馈 arc 设置确实是NP难的,但这是无向的情况。

答案 1 :(得分:4)

在具有正权重的加权有向图中找到最小权重反馈边集:

通过否定权重,观察它相当于找到最大权重反馈边缘集。 要查找最大权重反馈边集,请使用Prim或Kruskal算法构建MST。然后取该MST的补充。

为什么会这样? 这是基于以下观察:

边缘不在任何MST中,当且仅当存在一个周期,该边缘对该周期中所有其他边缘的最大权重。 或者,换句话说,边缘在某些MST中,当且仅当该边缘所属的每个周期时,它在该周期中的所有其他边缘上的权重不大。

实际上,假设我们有一个带边的最大权重反馈边设置,使得存在一个包含该边的循环和另一个具有更大权重的边,然后用另一个边替换该边将提供更大的反馈边集重量。

为了完整性,观察的证明

< =)假设边缘在一个周期中具有最大权重。如果它在某个MST中,那么用该循环中的另一个边缘替换该边缘将提供具有较小权重的MST。

=>)假设对于给定边缘所属的每个周期,在该周期中存在具有更大权重的边缘。如果它不在任何MST中,则将该边缘添加到MST将导致MST中的循环。然后从该循环中移​​除最大重量的边缘(与给定边缘不同)将提供具有较小重量的MST(并且包括该给定边缘)。

答案 2 :(得分:1)

这两个问题都是NP完全的。因此,即使是近似有效(多项式时间)解决方案也不太可能存在(http://en.wikipedia.org/wiki/Feedback_arc_set)。

如果您可以放宽对应用程序中严格的最小解决方案大小的要求,则可以使用其他启发式方法,但它们可能难以相互比较。

请注意,您可以轻松找到最小(非最小)解决方案:按任意顺序浏览任何反馈边缘的边缘,如果是冗余,则立即删除。对所有边缘进行一次扫描就足够了,并使用例如DFS执行冗余测试。

答案 3 :(得分:0)

对于任何反馈边缘,此图的补码必须是原始图的生成林。这就是补充图不包含任何循环,这是非常明显的。

问题a):
对于最小大小的反馈边集,这相当于找到跨越森林的最大大小。因此,我们可以简单地使用DFS来查找图的每个连接组件的生成树并获取补充。然后我们得到最小尺寸反馈边缘。实际上,我认为DFS不是必需的,只要我们可以为每个连接的组件找到生成树 问题b):
要找到最小的权重反馈边集,这相当于找到跨越森林的最大权重。然后我们可以使用Kruskal算法或Prim算法来查找每个连接组件的最大生成树。然后采取补充,我们将得到最小的体重反馈集。

答案 4 :(得分:-1)

您的解决方案A)将无效,因为您没有提供任何逻辑来判断边缘是否具有“后退”属性。

你的解决方案B)不起作用,因为Kruskal不会寻找反馈集,而是寻找最小加权覆盖树。最小加权树不一定包含反馈边集的原因的一个很好的例子是K4图。