繁体   English   中英

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

[英]How to find feedback edge set in undirected graph

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

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

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


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

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

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

有人能说出这个解决方案是否正确吗?

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

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

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

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

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

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

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

为了完整性,观察证明

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

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

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

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

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

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

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

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

您的解决方案B)将无法工作,因为Kruskal不会查找反馈集,而是查找最小加权覆盖树。 最小加权树不一定包括反馈边集的原因的一个很好的例子是K4图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM