我一直在寻找一个实现(我正在使用networkx库。),它将找到无向加权图的所有最小生成树(MST)。
我只能找到Kruskal算法和Prim算法的实现,这两种算法都只返回一个MST。
我已经看到了解决这个问题的论文(比如Representing all minimum spanning trees with applications to counting and generation),但是我的脑袋往往会在尝试思考如何将其翻译成代码时爆发。
事实上,我无法找到任何语言的实现!
答案 0 :(得分:9)
我不知道这是 解决方案,但它是一个解决方案(我会说这是蛮力的图形版本):
O(Elog(V) + V + n) for n = number of spanning trees
中完成,正如我从2分钟的谷歌了解的那样,可以改进。注意:懒惰地这样做!生成所有可能的树然后过滤结果将需要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值,就会停止枚举。