我正在尝试使用堆实现prim的最小生成树算法。
然而,当我执行我的代码时,我得到一个异常,堆是空的。
经过一些迭代后,它会说堆是空的。
这是我算法的主循环:

while(traversed.size() < n){
            Edge optimal = heap.minElem();
            heap.delMin();
            traversed.add(optimal.getDest());
            mst.set(optimal.getSource().getVertex(), optimal.getDest().getVertex(), optimal.getDist());
            mst.set(optimal.getDest().getVertex(), optimal.getSource().getVertex(), optimal.getDist());
            //now compute further adjacent
            getAdjacent(optimal.getDest(),myGraph,heap,traversed);

        }

我的get相邻方法是:
private void getAdjacent(Vertex v, CGraph graph, Heap<Edge> heap, Set<Vertex> traversed) throws Exception{
int val;
for(int i = 0; i < graph.numV; i++){
    val = graph.get(v.getVertex(), i);
    if((val != 0) && (val != CGraph.Infinity) && !(traversed.contains(new Vertex(i))) ){
        heap.insert(new Edge(graph.get(v.getVertex(),i),v, new Vertex(i)));
        }

    }
}

我已经看到它添加了所有的顶点,并且最终像原始图一样结束,所以它不维护树属性。
这是为什么?有人有线索吗?
非常感谢您的帮助。
谢谢!

最佳答案

我认为这是在创建循环,因为当你将一条边插入到堆中时,你只需要检查一个顶点是否处于“遍历”状态在插入和检索到的同一条边之间,可能已经从堆中检索到了其他边,因此顶点已经链接到树。

10-08 02:35