带有矩阵的Prim算法

时间:2013-01-16 22:51:01

标签: c++ algorithm prims-algorithm

我正在尝试用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循环的外观如何?我怎么知道我检查了所有节点?

提前致谢

3 个答案:

答案 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测试类。所以它应该是你正在寻找的。当然,单元测试类有一个实际的矩阵。实现类有代码。

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