就我的问题而言,我想知道为什么我们在Prim's Algorithm中使用优先级队列?
它如何使我们免于使用幼稚的方式(是的,我已经听说过,但不知道为什么)。

如果有人能一步一步解释邻接表,我将非常高兴。我正在用Cormen的书。

伪代码:

Prim(G,w,r) //what is w (weight?) and r?
  For each u in V[G]
    do key[u] ← ∞ // what is key?
       π[u] ← NIL
  key[r] ← 0
  Q ← V[G]
  While Q ≠ Ø
    do u ← EXTRACT-MIN(Q)
       for each v in Adj[u]
            if v is in Q and w(u,v) < key[v]
                 then π[v] ← u
                       key[v] ← w(u,v)

我正在考虑使用std::vector然后使用std::make_heap();作为存储边缘的优先级队列。

最佳答案

在prim的算法中,有一个步骤必须获得“最近”顶点。如果使用普通数组,此步骤将花费O(N),但是如果您使用优先级队列(例如,堆),则只需花费O(logN)

因此,使用优先级队列的原因是为了减少算法的时间复杂度(这意味着它可以使您的程序运行更快)

**

更新:

**

这是Wikipedia中Prim算法的描述。粗体部分是查找我所说的最接近顶点的部分:

输入:具有顶点V和边E(权重可以为负)的非空连接加权图。

初始化:Vnew = {x},其中x是V的任意节点(起点),Enew = {}

重复直到Vnew = V:
选择权重最小的边(u,v),以使u在Vnew中,而v不是(如果有多个权重相同的边,则可以选择其中任意一条)
将v添加到Vnew,并将(u,v)添加到Enew

输出:Vnew和Enew描述了最小生成树

10-04 20:29