首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prim算法实现中的错误,空堆

Prim算法实现中的错误,空堆
EN

Stack Overflow用户
提问于 2013-12-09 20:50:05
回答 1查看 178关注 0票数 0

我试图用堆实现Prim的最小生成树算法。但是,当我执行我的代码时,会得到一个异常,即堆是空的。

经过一些迭代之后,它说堆是空的。这是我算法的主要循环:

代码语言:javascript
复制
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);

        }

我的getAdjacent方法是:

代码语言:javascript
复制
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)));
        }

    }
}

我已经看到它添加了所有的顶点,并且像原来的图一样结束,所以它不属于树的属性。

为什么会这样呢?有人有线索吗?我将非常感谢你的帮助。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-10 18:22:23

我认为它是在创建循环,因为当您将边缘插入到堆中时,只会检查顶点是否在“遍历”中。在插入和检索到的同一边缘之间,可能已经从堆中检索到其他边缘,以便顶点已经链接到树。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20480498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档