我正在尝试用C ++和矩阵实现Prim的算法。
这是我的问题:
int node[] = {11, 11, 0, 11, 11, 11, 11, 11};
int nodeCon[8];
void generatePrims() {
int cNode = 3;
for (int i = 1; i <= 8; i++) {
if (graph[cNode][i] != 0){
if (node[i] > graph[cNode][i]) {
node[i] = graph[cNode][i];
nodeCon[i] = cNode;
}
}
}
};
cNode是起始节点。
graph[][]
是保存连接的2d矩阵。
nodeCon[]
是将保存MST连接的数组(该节点与其他节点连接)
node[]=
保存nodeCon的成本值。
我的问题是我将如何继续下一跳?假设我找到了最小连接,我将设置值cNode= minConnection
循环的外观如何?我怎么知道我检查了所有节点?
提前致谢
答案 0 :(得分:0)
这样的事情:
int node[]={11,11,0,11,11,11,11,11};
int used[]={0,0,0,0,0,0,0,0,0,0};
int nodeCon[8];
void generatePrims(){
int cNode = 3;
int next, min_now;
for(int i=0; i<8; ++i) {
used[cNode] = 1;
min_now = MAX_INT;
for(int i=1;i<=8;i++){
if(!used[i]){
if(node[i] > graph[cNode][i]){
node[i] = graph[cNode][i];
nodeCon[i]= cNode;
}
if(node[i] < min_now) {
min_now = node[i];
next = i;
}
}
}
cNode = next;
}
};
另外值得注意的是:如果不使用数组'used',你会使用未使用的顶点列表。
答案 1 :(得分:0)
我目前无法评论之前的答案(因为我没有足够的声誉)所以我会通过另一个答案来做到这一点。 Piotr解决方案几乎是正确的,但我相信Prim的算法不仅考虑当前节点。这里可以看到一个例子Prim's Algorithm。这实际上意味着您需要检查您访问过的节点的路径,而不仅仅是最近的节点。
这意味着您需要存储一个包含您访问过的节点的向量,并通过它们“存储每个”,而不是只检查您访问的最后一个节点的路径。
答案 2 :(得分:0)
以下网站有补充算法和junit测试类。所以它应该是你正在寻找的。当然,单元测试类有一个实际的矩阵。实现类有代码。