带有矩阵的普里姆算法

Prim's Algorithm with matrices

本文关键字:算法      更新时间:2023-10-16

我正在尝试用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[][]是包含连接的二维矩阵。

nodeCon[]是保存MST(该节点与其他节点连接)连接的数组

node[]=保存nodeCon的成本值。

我的问题是如何继续到下一跳?假设我找到了最小连接并将值设置为cNode= minConnection循环将会是什么样子?我怎么知道我检查了所有的节点?

Thanks in advance

像这样:

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',将会更快。

我目前不能评论上一个答案(因为我没有足够的声誉),所以我将通过另一个答案来评论。Piotr的解决方案几乎是正确的,但我相信Prim的算法考虑的不仅仅是当前节点。一个例子可以在这里看到Prim的算法。这本质上意味着你需要检查你访问过的节点的路径,而不仅仅是最近的节点。

这意味着你需要存储一个包含你访问过的节点和"for each"通过它们的向量,而不是仅仅检查从你访问的最后一个节点开始的路径。

下面的站点实现了算法和一个junit测试类。所以它应该是你要找的。当然,单元测试类有一个实际的矩阵。实现类有代码。

http://www.geekviewpoint.com/java/graph/mst