我试图找到一种有效的方法来检测给定图G是否具有两个不同的最小生成树。我还试图找到一种方法来检查它是否具有3个不同的最小生成树。我曾经想过的天真的解决方案是运行一次Kruskal算法,然后找到最小生成树的总权重。稍后,从图中移除一条边并再次运行Kruskal算法,并检查新树的权重是否为原始最小生成树的权重,因此对图中的每条边也是如此。运行时是O(| V || E | log | V |),这一点都不好,我认为有更好的方法来执行。
任何建议都会有所帮助,在此先感谢
我试图找到一种有效的方法来检测给定图G是否具有两个不同的最小生成树。我还试图找到一种方法来检查它是否具有3个不同的最小生成树。我曾经想过的天真的解决方案是运行一次Kruskal算法,然后找到最小生成树的总权重。稍后,从图中移除一条边并再次运行Kruskal算法,并检查新树的权重是否为原始最小生成树的权重,因此对图中的每条边也是如此。运行时是O(| V || E | log | V |),这一点都不好,我认为有更好的方法来执行。
任何建议都会有所帮助,在此先感谢
Answers:
Kapoor&Ramesh(正确的SIAM J. Comput。版本,免费(?)个人网站版本)提供了一种算法,用于枚举加权图和非加权图中的所有最小生成树。
我对基本概念的理解是,您先从一个MST开始,然后交换沿图形周期分布的边(只要权重正常,您就用一个已知的边替换了一个边,您会重新连接树) 。
对于加权情况下,它们给出一个运行时间列出的所有最小生成树其中Ñ是这样的生成树的数目。它按权重增加的顺序对它们进行枚举,而我目前(对课程的了解)表明,在生成一定数量的树后终止算法是完全可行的(因为它只是从MST开始并顺序生成)。
可以证明,Kruskal算法可以找到每一个最小的生成树。看到这里。
因此,您可以执行Kruskal,并且每当有多个边可供选择时,就可以执行分支。一旦分支了次,您就会知道至少有k个不同的最小生成树。不幸的是,多个分支可能会通过以不同顺序添加相同权重的边来生成同一棵树,因此如果没有进一步的工作/了解,这将无济于事。
修改Kruskal算法:在对边缘进行排序时,以相等的权重对边缘进行聚类。现在,在按顺序处理边缘的时候,每次到达新的群集时,首先要分别检查所有边缘,并从群集中删除那些将关闭循环的边缘(给定在群集之前构建的对象)。然后,运行群集中的所有其余边缘,现在尝试将它们添加到MST中。如果它们中的任何一个结束一个周期,则这一定是由于之前插入的同一群集的其他边缘,这意味着您有多个MST。
该解决方案保留了Kruskal算法的复杂性,只是增加了处理每个边缘的时间。