void PrimMST(float A[GsizeSqr][GsizeSqr])
{
int i, j, pCount, gs, row, ind, findN;
gs = sqrt(GsizeSqr);
pCount = 0;
D_array MST; //MST contains the nodes of the MST and is initialized with the starting node
initArr(&MST, 1);
int p[GsizeSqr];
float priority[GsizeSqr]; //priority contains weight(u, p[u])
//Initialize p and priority with infinity and NULL values (note: -1 means null and 1000000 means inf)
for(i=0; i < GsizeSqr; i++){
p[i] = -1;
priority[i] = 1000000;
}
PriorityQueue Q; //Initialize priority queue that stores (priority, key) values
Q = init_heap(GsizeSqr);
for(i=0; i < gs; i++){ //Insert input adjacency matrix into priority queue
for(j=0; j < gs; j++){
node n;
n = create_node(A[i][j], pCount++);
enqueue(Q, n);
}
}
node start; //Select starting node and insert to MST
start = create_node(0, 0);
insArr(&MST, start);
priority[0] = 0;
while(Q->heap_size != 1){ //while Q not empty
node u;
u = dequeue(Q);
if(p[u.key] != -1)
insArr(&MST, u);
row = ceil(u.key/gs);
//For each adjacent node A[row][i]
for(i=0; i < gs; i++){
if(A[row][i] != 0.0){
ind = i*gs + row; //Calculate index of adjacent node
findN = find_node(Q, ind); //find and return index of adjacent node in queue
if(findN != 0 && u.priority < Q->elements[findN].priority){
set_priority(Q, findN, u.priority);
p[findN] = u.key;
}
}
}
}
}
我正在尝试使用与在线许多源类似的伪代码使用优先级队列创建Prim算法的C实现。最终目标是(希望)一些漂亮的迷宫一代。我只是对实施的细节感到困惑。
输入:具有随机权重的邻接矩阵
所需输出:最小生成树的邻接矩阵
*编辑:添加了我的(不工作)尝试。我仍然得到一棵不正确的树,我不知道我哪里出错了。我想我会从这段代码的另一双眼中受益。
答案 0 :(得分:1)
第一个问题: A是包含MST边缘的集合。 p [u]表示当前哪个节点与u有最小边,也就是说,如果你有三个边(节点1,节点2,权重)(1,2,5),(1,3,4), (1,4,10),然后p [1] = 3,现在优先级[1]为4。
第二个:
不,该节点在u := EXTRACT-MIN(Q);
之后弹出,