[英]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中)是否会形成一个循环的更多详细信息。 棘手的部分是如何确定直线时间中两个顶点是否在同一分量中。
我目前的想法是
谁能说出我的想法是否有缺陷? 如果是这样,解决这个问题的最佳方法是什么? 非常感谢你!
我建议您对给定问题做类似第二个答案的操作:
这是prim的算法:
首先选择任何顶点作为树的根。
虽然树在图中未包含所有顶点,但找到离开树的最短边并将其添加到树中。
因此,现在,如果我们可以在O(1)的时间内对离开树的边缘集合进行查找,并且可以使该集合保持更新,以便总O(| E |)的时间始终在恒定的时间内进行搜索,那么我们很好。
现在,要使这种情况发生,请考虑将树保留为链接列表的一组边。 现在,只要将顶点添加到构成MST的一组顶点中,就迭代其邻接表,并将权重1的边添加到列表的前面,并将权重2的边添加到列表的末尾。 现在,只要您想离开树的最小边缘,就从链接列表的前面选择一个!
这种方法的唯一问题是,您只应将边缘添加到“离开树”的列表中! 因为如果不这样做,我们最终可能会陷入循环! 为了检查每个边缘的“离开树”属性,我们可以使用一组选定的顶点,并且可以在添加之前检查每个边缘,因为它在集合中没有两端,所以简单地在添加将新添加的顶点的边缘添加到离开树的一组边上,首先检查该边的另一端的顶点是否在树的选定顶点集中,然后仅当另一边不是该边时才将其添加到列表中t在集合中。 您可以在O(1)时间内检查集合中某个元素的存在,这样就不会导致循环!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.