当前位置: 首页 > 知识库问答 >
问题:

prim算法的解释

傅花蜂
2023-03-14

我必须使用基于最小堆的优先级队列来实现Prim的算法。如果我的图包含顶点A、B、C和D以及下面的无向邻接列表...[它被排序为(顶点名称,相邻顶点的权重)]

A -> B,4 -> D,3
B -> A,4 -> C,1 -> D,7
C -> B,1
D -> B,7 -> A,3

粗图:

A-4-B-1-C
|   /
3  7
| /
D

优先级队列是什么样子的?我不知道该往里面放什么。我应该把所有东西都放进去吗?我应该只写A、B、C和D。我不知道,我真的很想得到答案。

共有3个答案

乌学博
2023-03-14

可以为顶点指定权重。然后基于这些权重使用优先级队列。这是来自wiki的参考:http://en.wikipedia.org/wiki/Prims_算法

MST-PRIM (G, w, r) {
for each u ∈ G.V
u.key = ∞
u.parent = NIL
r.key = 0
Q = G.V
while (Q ≠ ø)
u = Extract-Min(Q)
for each v ∈ G.Adj[u]
if (v ∈ Q) and w(u,v) < v.key
v.parent = u
v.key = w(u,v)
}

Q将是您的优先队列。可以使用struct保存顶点的信息。

杭涵映
2023-03-14

这是prim的算法:

Choose a node. 
Mark it as visited.
Place all edges from this node into a priority queue (sorted to give smallest weights first).  
While queue not empty:  
    pop edge from queue
    if both ends are visited, continue
    add this edge to your minimum spanning tree
    add all edges coming out of the node that hasn't been visited to the queue
    mark that node as visited

为了回答你的问题,你把边从一个节点放进去。

如果将所有边缘放入优先级队列,则得到 Kruskal 算法,该算法也用于最小生成树。

这取决于您如何表示图形的运行时间。邻接列表使Kruskal和Prim的复杂度O(E log E)为O(E logv),除非您使用fibonacci堆,在这种情况下,您可以实现O(E V log V)。

丁英韶
2023-03-14
Prim's: grow the tree by adding the edge of min weight with exactly one end in the tree.
The PQ contains the edges with one end in the tree.
Start with vertex 0 added to tree and add all vertices connected to 0 into the PQ.
DeleteMin() will give you the min weight edge (v, w), you add it to the MST and add all vertices connected to w into the PQ.

is this enough to get you started?
---
so, in your example, the in the first iteration, the MST will contain vertex A, and the PQ will contain the 2 edges going out from A:
A-4-B
A-3-D
 类似资料:
  • 一、普里姆算法介绍 普里姆(Prim)算法,是用来求加权连通图的最小生成树的算法。 基本思想 对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为

  • 本文向大家介绍Javascript中的Prim算法,包括了Javascript中的Prim算法的使用技巧和注意事项,需要的朋友参考一下 Prim的算法是一种贪婪算法,可为加权无向图找到最小生成树。它找到形成树的边缘子集,该树包括每个顶点,树中所有边缘的总权重最小。 该算法的工作方式是,从任意起始顶点一次构建一个树,在每个步骤中,从树到另一个顶点添加最便宜的连接。 Prim的算法如何工作? 让我们看

  • 亲爱的读者,这些Data Structures & Algorithms Interview Questions专门设计用于让您熟悉在面试Data Structures & Algorithms时可能遇到的问题的本质。 根据我的经验,好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容: 什么是数据结构? 数据结构是一种

  • Prim用于查找最小成本生成树的算法(如Kruskal算法)使用贪婪方法。 Prim的算法与shortest path first算法共享相似性。 与Kruskal算法相比,Prim的算法将节点视为单个树,并继续从给定图形向生成树添加新节点。 为了与Kruskal的算法形成对比并更好地理解Prim算法,我们将使用相同的例子 - 第1步 - 删除所有循环和平行边缘 从给定图中删除所有循环和平行边。

  • 本文向大家介绍Prim算法和Kruskal算法之间的区别,包括了Prim算法和Kruskal算法之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解Prim算法和Kruskal算法之间的差异。 最小生成树(MST)的Kruskal算法 给定一个连通图和无向图时,此类图的生成树就是子图,该子图是连接所有顶点的树。 单个图可以具有多个生成树。 加权图,连接图和无向图的最小生成树(M

  • 对于我们最后的图算法,让我们考虑一个在线游戏设计师和网络收音机提供商面临的问题。 问题是他们想有效地将一条信息传递给任何人和每个可能在听的人。 这在游戏中是重要的,使得所有玩家知道每个其他玩家的最新位置。 对于网络收音机是重要的,以便所有该调频的收听者获得他们需要的所有数据来刷新他们正在收听的歌曲。 Figure 9 说明了广播问题。 Figure 9 这个问题有一些强力的解决方案,所以先看看他们