我有一个小图(<30条边),其中许多边只有3种可能的长度。
为了获得最佳树,我开始寻找最小的生成树。但是很可能有多种解决方案,在这种情况下,我想获得 all 个最小生成树,以便应用其他自定义过滤器。
让我们从一个示例开始:
在这里,可能的MST是 ac,cd,ab 和 ac,cd,bc 。
我开始在Kruskal中找到它们,我们需要首先按长度对边缘进行排序。
我的想法是找到所有可能的排序列表,然后对每个列表应用Kruskal。更准确地说,我将边缘按长度分组,然后找到每个组的所有可能排列。对于以下示例,所有可能的排序列表为:
有效。对于这个小图。
但是,如果我尝试使用具有10个相同长度的边的图形进行尝试,则可能存在数百万种可能的排列,并且对它们中的每一个应用Kruskal并没有真正优化。
有什么主意吗?
答案 0 :(得分:0)
您可以以多种可能的方式进行操作,您需要使用Kruskal或prims算法并对其进行修改,以便每次找到具有相同权重的边时都进行递归并从实际顶点重新开始新的树。
返回所有可能的MST效率不高,请考虑一个具有所有权重相同的边的完全连接的图。将会有O(n ^ n)个可能的树。
很多树将具有相等的部分,因此您可以找到更好的解决方案,但是您仍然需要全部归还它们,这效率不高。
您可以阅读本文的更多内容Algorithm for Enumerating All Spanning Trees of Undirected and Weighted Graphs 或python implementation