所有最小生成树实现

时间:2010-05-29 16:17:23

标签: python algorithm language-agnostic graph-theory minimum-spanning-tree

我一直在寻找一个实现(我正在使用networkx库。),它将找到无向加权图的所有最小生成树(MST)。

我只能找到Kruskal算法和Prim算法的实现,这两种算法都只返回一个MST。

我已经看到了解决这个问题的论文(比如Representing all minimum spanning trees with applications to counting and generation),但是我的脑袋往往会在尝试思考如何将其翻译成代码时爆发。

事实上,我无法找到任何语言的实现!

4 个答案:

答案 0 :(得分:9)

我不知道这是 解决方案,但它是一个解决方案(我会说这是蛮力的图形版本):

  1. 使用kruskal或prim算法查找图表的MST。这应该是O(E log V)。
  2. 生成所有生成树。这可以在O(Elog(V) + V + n) for n = number of spanning trees中完成,正如我从2分钟的谷歌了解的那样,可以改进。
  3. 通过树的权重等于MST的权重来过滤步骤#2中生成的列表。对于n,这应该是O(n),作为步骤#2中生成的树的数量。
  4. 注意:懒惰地这样做!生成所有可能的树然后过滤结果将需要O(V ^ 2)内存,并且多项式空间要求是邪恶的 - 生成树,检查它的权重,如果它是MST将其添加到结果列表,如果不是 - 丢弃它。
    总时间复杂度:O(Elog(V) + V + n) for G(V,E) with n spanning trees

答案 1 :(得分:8)

Rubys给出了一个很好的一般答案。但是编写高效的代码来生成图形的所有生成树是一个挑战的野兽。

在2003年12月左右,在this page的中途,您将找到Knuth算法的CWEB实现,该算法可查找给定图形的所有生成树。

答案 2 :(得分:2)

Ronald Rivest在Python中有一个很好的实现,mst.py

答案 3 :(得分:0)

您可以在Sorensen and Janssens (2005)的作品中找到一个想法。

我们的想法是按递增顺序生成ST,一旦获得更大的ST值,就会停止枚举。