正如我的问题所说,我想知道为什么我们要在中使用优先级队列?它如何将我们从天真的方式中拯救出来(是的,我听说过,但不知道为什么)。
如果有人能一步一步地解释邻接表,我会很高兴的。我在用科尔曼的书。
伪代码:
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
如果使用邻接矩阵表示,Prim算法的时间复杂度为O(|V|^2)。
我试图用邻接矩阵实现Prim的算法。我正在使用作为参考。
V = {1,2...,n}
U = {1}
T = NULL
while V != U:
/*
Now this implementation means that
I find lowest cost edge in O(n).
How do I do that using adjacency list?
*/
let (u, v) be the lowest cost e
实际上,我想知道prim和Dijkstra算法的含义。如果有人能教我如何用JAVA编写它,我将不胜感激。我试着理解某人的prim算法代码,但我在某个地方卡住了。
下面显示的代码是一个随机矩阵。我想继续写素数的算法。有谁能帮上忙吗?
import java.util.*;
class RandomGraph
{
public static Scanner br = new Scanner(System.in);
static int w [][];
static int n;
static int i, j;
public static void
可以使用Prim算法或Kruskal算法来寻找顶点/节点和边/链路的集合的最小生成树/图。我想要的是找到这个集合的最小生成图的算法,但是结果图只需要包括任意选择的节点,而不是所有节点。如果结果图包含比所需节点更多的节点,这是可以的。
这样的算法存在吗?也许在修改图以仅包括所需节点后,可以只使用Prim(或Kruskal)算法?但是,我不确定如何修改图形来做到这一点,同时保持它的连通性。
例如,假设我们有一个菱形的起始图(在括号中有链接的成本):
A
(2)/ \(1)
B C
(2)\ /(5)
D
现在,我们任意决定只需要节点A和D。如果我们从A开始,我们仍然希望它走
请帮助理解prims,所有伪码(如在核心和维基) 。
MST-PRIM (G, w, r) {
for each u ∈ G.V
u.key = ∞
u.parent = NIL
r.key = 0
Q = G.V
while (Q ≠ ø)
//1
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)}
我能理解到直到1或同时循环,r.key=0保证首先扫描根的近邻或邻接,但由于u已经属于Q (到目前为止还不包括在素数最小生成树