Java Prim';s算法

Java Prim';s算法,java,priority-queue,adjacency-matrix,prims-algorithm,Java,Priority Queue,Adjacency Matrix,Prims Algorithm,我正在使用Java中的with PriorityQueue开发最小生成树。然而,我得到的总重量(树的最小重量)是错误的 我是否误解了总重量背后的概念,或者我的代码有问题 public int getMinSpanningTree(Graph g) { int[][] matrix = g.getEdgeMatrix(); int totalVertices = g.getNumberOfVertices(); boolean[] visit = new boolean[t

我正在使用Java中的with 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;
}
public int getMinSpanningTree(图g){
int[][]矩阵=g.getEdgeMatrix();
int totalVertices=g.getNumberOfVertices();
布尔[]访问=新布尔[TotalVertexts];
int visitNum=1;
整数总权重=0;
PriorityQueue=新建PriorityQueue();
//第一次迭代
访问[0]=真;
对于(int i=0;i0){
优先级顶点温度=新的优先级顶点(i,g.getWeight(0,i));
添加(临时);
} 
}
while(visitNum0和访问[k]==false){
PriorityVertex=新的PriorityVertex(k,g.getWeight(temp.vertex,k));
添加(顶点);
} 
}
}
返回总重量;
}

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

假设下图:

weight(0,1) = 1
weight(0,2) = 2
weight(1,2) = 3
weight(1,3) = 4
weight(2,3) = 5
在“第一次迭代”之后,队列包含PriorityVertex(1,1)、PriorityVertex(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!