【问题标题】:Prim's AlgorithmPrim 算法
【发布时间】:2013-05-25 13:31:31
【问题描述】:

我正在使用Prim's Algorithm 和 Java 中的 PriorityQueue 来研究最小生成树。但是,我弄错了总重量(树的最小重量)。

是我误解了总重量背后的概念,还是我的代码有问题?

public int getMinSpanningTree(Graph g) {
    int[][] matrix = g.getEdgeMatrix();
    int totalVertices = g.getNumberOfVertices();
    boolean[] visit = new boolean[totalVertices];
    int visitNum = 1;
    int totalWeight = 0;
    PriorityQueue<PriorityVertex> queue = new PriorityQueue<PriorityVertex>();

    //FIRST ITERATION
    visit[0] = true;
    for (int i = 0; i < totalVertices; i++) {
        if(matrix[0][i] > 0) {
            PriorityVertex temp = new PriorityVertex(i, g.getWeight(0,i));
            queue.add(temp);
        } 
    }

    while (visitNum < totalVertices) {
        PriorityVertex temp = queue.poll();
        visit[temp.vertex] = true;
        visitNum++;
        totalWeight = temp.priority + totalWeight;
        //RUN NEIGHBOUR VERTICES
        for (int k = 0; k < totalVertices; k++) {
           if(matrix[temp.vertex][k] > 0 && visit[k] == false) {
               PriorityVertex vertex = new PriorityVertex(k, g.getWeight(temp.vertex, k));
               queue.add(vertex);
           } 
        }
    }
    return totalWeight;
}

【问题讨论】:

    标签: java priority-queue adjacency-matrix prims-algorithm


    【解决方案1】:

    问题是您没有从队列中删除所有顶点实例 => 同一顶点可以多次添加到结果中。

    假设如下图:

    weight(0,1) = 1
    weight(0,2) = 2
    weight(1,2) = 3
    weight(1,3) = 4
    weight(2,3) = 5
    

    在“FIRST ITERATION”之后,队列包含 PriorityVertex(1, 1)、PriortyVertex(2, 2)。

    while循环的迭代次数:

    1) removed: PriorityVertex(1, 1) - edge (0,1) 
       added: PriorityVerterx(2, 3) and PriorityVertex(3, 4)
       queue: PriorityVertex(2, 2), PriorityVertex(2, 3), PriorityVertex(3, 4)
    
    2) removed: PriorityVertex(2, 2) - edge (0,2)
       added: PriorityVertex(3, 5)
       queue: PriorityVertex(2, 3), PriorityVertex(3, 4), PriorityVertex(3, 5)
    
    3) removed: PriorityVertex(2, 3) - edge (1,2), cycle in the result!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多