在图中的O(V + E)时间中查找MST

时间:2015-06-08 22:37:10

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

以前曾问过类似的问题,如https://cs.stackexchange.com/questions/28635/find-an-mst-in-a-graph-with-edge-weights-from-1-2

问题是: 给定连通无向图G =(V,E)和权函数w:E→{1,2},建议一种有效的算法,在不使用Kruskal的情况下在O(V + E)中找到图的MST。

我在上面的帖子中查看了建议的解决方案,但我仍然不确定如何使其工作。第一个建议不考虑组件。如果将新考虑的边缘添加到当前MST中,则第二个建议没有提供关于如何识别新考虑的边缘是否将形成循环的更多细节。棘手的部分是如何识别两个顶点在线性时间内是否在同一个组件中。

我目前的想法是

  1. 对顶点进行排序,可以在线性时间内完成
  2. 首先考虑重量为1的边缘。当边数小于或等于| V1 | -1时,将边添加到MST。 V1是边缘上的顶点,权重为1.我们需要确保检查权重为1的所有顶点。散列集可用于存储V1和边。
  3. 使用相同的逻辑将V2添加到图表中。
  4. 如果我的想法有缺陷,有人会建议吗?如果是这样,解决这个问题的最佳方法是什么?非常感谢你!

1 个答案:

答案 0 :(得分:1)

我建议你做一些像给定问题中第二个答案的事情:

这是原始算法:

  

首先选择任何顶点作为树的根。

     

虽然树不包含图中的所有顶点   离开树的最短边缘并将其添加到树中。

所以现在如果我们可以在O(1)时间内在树的边缘中执行查找并且我们可以保持更新的集合,那么搜索总是可以在总时间O(| E |)时间内发生那么我们很高兴。

现在要发生这种情况,请考虑将树保留为链表的边集。现在每当顶点被添加到形成MST的顶点集时,迭代其邻接列表并将权重1的边添加到列表的前面,并将权重2的边添加到列表的末尾。现在,只要你想要离开树的最小边缘,只需从链表的前面取一个!

这种方法的唯一问题是你应该只将边添加到列表中,而#34;留下树"!因为如果我们不这样做,我们最终可能会有周期!为了检查这个"离开树"每个边的属性,我们可以使用一组选定的顶点,我们可以在添加之前检查每个边,它在集合中没有两端,所以只需在添加新添加顶点的边时要离开树的边集,首先检查边的另一端的顶点是否在树的选定顶点集中,并且只有当另一边不在集合中时才将边添加到列表中。您可以在O(1)时间内检查集合中是否存在元素,这样您就不会以循环结束!