查找边长为{1,2,3}的图的最小生成树的算法

时间:2016-02-25 18:09:35

标签: algorithm graph graph-algorithm minimum-spanning-tree

我最近一直在研究Prims / Kruskals算法,以便在图表中查找最小生成树,我对以下问题感兴趣:

设G是具有m个边的n个顶点上的无向图,使得每个边具有权重w(e)∈{1,2,3}。是否有算法在时间O(n + m)中找到G的最小生成树?

显然,你可以在图表上运行Prims,你会获得最小的生成树,但不是在所需的时间内。

我在想我们可以首先将每个重量为1的边添加到树中,前提是它没有创建循环,好像有一个重量1的边缘没有产生循环,那么它优于重量边缘2说,并按顺序递增。

任何有关设计算法的可能方法的帮助都会受到赞赏,任何实现(java更可取,但欢迎任何语言)都会非常有用。

1 个答案:

答案 0 :(得分:1)

您正在描述Kruskal算法的一个微小变化,它为m边缘按重量O(m)排序成本,因为您只需要将边缘放在3个桶中。

由于disjoint set data structure的惊人特性,Kruskal的其余部分几乎都是O(m),因此你应该保持良好状态。

构建树本身应该是O(m)而不是O(n + m),因为没有必要处理顶点。例如。如果你在一个巨大的顶点上有一些边缘,大多数没有连接,如果你对数据结构设计很小心,后者不需要增加算法成本。