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

Algorithm 如何在无向图中找到反馈边集,algorithm,graph,kruskals-algorithm,Algorithm,Graph,Kruskals Algorithm,设G=(V,E)为无向图。一组F⊆ 边的E称为a 如果G的每个循环在F中至少有一条边,则设置反馈边。 (a) 假设G是未加权的。设计一个高效的算法来寻找 最小尺寸反馈边集 (b) 假设G是一个边权为正的加权无向图。 设计了一种寻找最小权反馈边集的有效算法 我的解决方案(需要建议): a) 最小大小反馈边集:由于图形未加权,我们可以使用DFS。我们像往常一样从任何顶点开始DFS。当我们遇到一个后边缘时,我们将其插入到一组反馈边缘中。当DFS完成时,集合将成为答案 b) 最小权重反馈边集:因为图是

设G=(V,E)为无向图。一组F⊆ 边的E称为a 如果G的每个循环在F中至少有一条边,则设置反馈边。

(a) 假设G是未加权的。设计一个高效的算法来寻找 最小尺寸反馈边集

(b) 假设G是一个边权为正的加权无向图。 设计了一种寻找最小权反馈边集的有效算法


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

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

b) 最小权重反馈边集:因为图是加权的,所以我们可以使用Kruskal。但克鲁斯卡尔通常从重量最小的边缘开始。如果我们可以否定所有的边权重,然后运行Kruskal,每当我们在相同组件的顶点之间得到一条边,我们就可以将它保存在反馈边集中。最后,求反边权重。我建议否定边权重的原因是因为我们需要最小权重反馈集。对于否定权重,Kruskal将从权重最小(实际上最大)的边开始,并将为权重较小的相同组件查找边

有人能判断此解决方案是否正确吗?

您的解决方案A)不起作用,因为您没有提供任何逻辑来决定边缘是否具有“后退”属性


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

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

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


请注意,您可以很容易地找到最小(而非最小)解决方案:以任何顺序遍历任何反馈边集的边,如果重新对齐,则立即删除。一次扫描所有边缘就足够了,并使用DFS等执行冗余测试。

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


反馈弧集确实是NP难的,但这是无向情况。

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

通过对权重求反,观察其等价于找到最大权重反馈边集。 要找到最大权重反馈边集,请使用Prim或Kruskal算法构建MST。然后取MST的补码

它为什么有效? 这是基于以下观察结果:

一条边不在任何MST中,当且仅当存在一个循环,该循环中该边相对于该循环中的所有其他边具有最大权重时。 或者,换句话说,一条边在某个MST中当且仅当对于该边所属的每个循环,它不是该循环中所有其他边的最大权重

事实上,假设我们有一个最大权重反馈边集,其中有一条边,存在一个包含该边和另一条具有更大权重的边的循环,那么用该另一条边替换该边将提供更大权重的反馈边集

为了完整性,对观察结果进行证明:


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

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

问题a):
对于最小大小的反馈边集,这等价于找到最大大小的生成林。因此,我们可以简单地使用DFS来找到图中每个连接组件的生成树,并取其补码。然后我们得到最小尺寸的反馈边。实际上,我认为DFS是没有必要的,只要我们能为每个连接的组件找到一个生成树。
问题b):

要找到最小权重反馈边集,这相当于找到最大权重生成林。然后我们可以使用Kruskal算法或Prim算法来找到每个连接组件的最大生成树。然后取补码,我们将得到一个最小权重反馈集。

至于a部分的答案),无向图上的DFS将边分为树边和后边-这是关于DFS的一个非常基本的事实。不过,我对这个问题的回答太快了。当DFS遇到已访问的节点时,确实可以使用DFS检测周期。但是,您将如何选择该周期的哪条边将成为反馈边集的一部分?您可以选择使用DFS并选择指向已访问节点的任何边(而不仅仅是指向祖先的边)。这肯定会给你一个反馈边缘集。但同样,E也是一个反馈边集。你要寻找的是一个最小大小的反馈边集。DFS无法提供逻辑的一个很好的例子是一个由两个循环组成的图,其中一条边是公共的。您的DFS无法标记o