Algorithm 求权值仅为1和2的生成树的算法

Algorithm 求权值仅为1和2的生成树的算法,algorithm,graph,graph-algorithm,minimum-spanning-tree,Algorithm,Graph,Graph Algorithm,Minimum Spanning Tree,给定一个加权的、连通的、简单的无向图G,每边上的权值仅为1和2,求G在O(V+E)中的MST。 有什么想法吗 对不起,这个问题的措辞,我已经尽力翻译了 当边具有任意权重时,Prim的算法计算最小生成树 Prim的算法的工作原理是,从某个任意节点开始,进行一种广度优先搜索,并将边保持在优先队列中。它不断提取权重最低的边,或者在不展开搜索的情况下丢弃它(如果边指向树中已存在的节点),或者将其添加到结果中,将其相反的节点标记为树中的节点,然后展开搜索 按照我刚才解释的简单方式,Prim的算法主要由排队

给定一个加权的、连通的、简单的无向图G,每边上的权值仅为1和2,求G在O(V+E)中的MST。 有什么想法吗


对不起,这个问题的措辞,我已经尽力翻译了

当边具有任意权重时,Prim的算法计算最小生成树

Prim的算法的工作原理是,从某个任意节点开始,进行一种广度优先搜索,并将边保持在优先队列中。它不断提取权重最低的边,或者在不展开搜索的情况下丢弃它(如果边指向树中已存在的节点),或者将其添加到结果中,将其相反的节点标记为树中的节点,然后展开搜索

按照我刚才解释的简单方式,Prim的算法主要由排队成本和将
|E |
边缘放入/移出优先级队列的成本决定。每次排队/退队需要
O(log | E |)
时间,因此总的渐近代价是
O(| E | log | E |)
时间,或者更恰当地说,
O(| E | log | E |+| V |)

如果我们有某种方法在固定时间内进行排队和退队,那么总运行时间将是
O(|E|+|V|)

在这种情况下,您需要一种存储活动边的方法,以便能够以最小的权重访问和删除边

通常有一个广泛的权重范围,并使用某种方法来存储边缘

但是,在这种情况下,权重为1或2,因此您可以简单地将边存储在两个单独的列表中,一个用于权重为1的边,另一个用于权重为2的边

要找到权重最低的边,只需从第一个列表中选择一个,除非它为空,在这种情况下,从第二个列表中选择一个边


从列表中访问和删除元素是O(1),因此Prim的算法将在O(V+E)中运行。

提示:更改优先级队列实现。您是指使用Union Find实现Kruskal还是使用Min Heaps实现Prim?Kruskal是
O(E*InverseAccermann(V))
,因为您可以使用计数排序进行排序,就所有实际目的而言,这也可能是
O(E)
。这实际上应该比
O(V+E)
更好,但是如果你想这样做,考虑一下你如何调整Prim的算法来考虑你的小边权重。你在想什么变化?Prim的主要问题是,我需要在每次迭代中找到具有最小“权重”的顶点,并且总体上需要
O(V^2)
。我错过了什么?@Shookie-这是一个实现。另一个涉及使用堆并获得
O((E+V)log V)
时间复杂度。想一想如何摆脱
logv
因素。请参阅维基百科条目。