繁体   English   中英

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

[英]Find a MST in O(V+E) Time in a Graph

之前也曾问过类似的问题,例如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},建议一种高效的算法,无需使用O(V + E)即可找到图的MST克鲁斯卡。

我在上面的线程中查看了建议的解决方案,但仍不确定如何使其工作。 第一条建议不考虑组件。 第二个建议没有提供更多有关如何识别新考虑的边沿(如果将其添加到当前MST中)是否会形成一个循环的更多详细信息。 棘手的部分是如何确定直线时间中两个顶点是否在同一分量中。

我目前的想法是

  1. 对顶点排序,可以在线性时间内完成
  2. 首先考虑权重为1的边。 当边的数量小于或等于| V1 | -1时,将边添加到MST中。 V1是权重为1的边上的顶点。我们需要确保选中权重为1的所有顶点。 哈希集可用于存储V1和边。
  3. 使用相同的逻辑将V2添加到图形中。

谁能说出我的想法是否有缺陷? 如果是这样,解决这个问题的最佳方法是什么? 非常感谢你!

我建议您对给定问题做类似第二个答案的操作:

这是prim的算法:

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

虽然树在图中未包含所有顶点,但找到离开树的最短边并将其添加到树中。

因此,现在,如果我们可以在O(1)的时间内对离开树的边缘集合进行查找,并且可以使该集合保持更新,以便总O(| E |)的时间始终在恒定的时间内进行搜索,那么我们很好。

现在,要使这种情况发生,请考虑将树保留为链接列表的一组边。 现在,只要将顶点添加到构成MST的一组顶点中,就迭代其邻接表,并将权重1的边添加到列表的前面,并将权重2的边添加到列表的末尾。 现在,只要您想离开树的最小边缘,就从链接列表的前面选择一个!

这种方法的唯一问题是,您只应将边缘添加到“离开树”的列表中! 因为如果不这样做,我们最终可能会陷入循环! 为了检查每个边缘的“离开树”属性,我们可以使用一组选定的顶点,并且可以在添加之前检查每个边缘,因为它在集合中没有两端,所以简单地在添加将新添加的顶点的边缘添加到离开树的一组边上,首先检查该边的另一端的顶点是否在树的选定顶点集中,然后仅当另一边不是该边时才将其添加到列表中t在集合中。 您可以在O(1)时间内检查集合中某个元素的存在,这样就不会导致循环!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM