Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Prim';s算法,使用优先级队列_Java_Algorithm_Minimum Spanning Tree_Prims Algorithm - Fatal编程技术网

Java Prim';s算法,使用优先级队列

Java Prim';s算法,使用优先级队列,java,algorithm,minimum-spanning-tree,prims-algorithm,Java,Algorithm,Minimum Spanning Tree,Prims Algorithm,我正在尝试实现prim的算法,使用优先级队列。当我调用offer()方法时,它给了我一个类强制转换异常,表示顶点不能强制转换为可比较的。有解决办法吗 public static Collection<Edge> prims(Graph g, int start) { ArrayList<Edge> mst = new ArrayList<Edge>(); PriorityQueue<Vertex> v

我正在尝试实现prim的算法,使用优先级队列。当我调用offer()方法时,它给了我一个类强制转换异常,表示顶点不能强制转换为可比较的。有解决办法吗

public static Collection<Edge> prims(Graph g, int start) {
            ArrayList<Edge> mst = new ArrayList<Edge>();
            PriorityQueue<Vertex> vertices = new PriorityQueue<Vertex>();
            Vertex startVertex;

        for (Vertex vertex : g.getVertices()) {
            vertices.offer(vertex);
            if (vertex.getId() == start) {
                startVertex = vertex;
            }
        }

        if (!mst.isEmpty()) {
            return mst;
        }

        return null;
    }
}
publicstaticcollection原语(图g,int start){
ArrayList mst=新的ArrayList();
PriorityQueue顶点=新建PriorityQueue();
顶点startVertex;
对于(顶点:g.getVertexs()){
提供(顶点);
if(vertex.getId()=开始){
startVertex=顶点;
}
}
如果(!mst.isEmpty()){
返回mst;
}
返回null;
}
}

是:您需要
顶点
方法来实现
可比

Java的
PriorityQueue
是一个堆的实现,它具有日志时插入和日志时删除最小元素的功能。但是为了让它有意义,你需要有一个最小值的概念;这意味着您需要将放入
PriorityQueue
中的任何内容都设置为
可比性
,以便可以比较堆中的两个元素

可比
元素可以插入到
优先级队列
中的原因是,您还可以在构造函数中指定一个
比较器
,而不是使用
可比
元素。因此,作为替代方案,您可以保留
Vertex
类,但使用适当的构造函数(这也需要您指定初始容量):

PriorityQueue顶点=新的PriorityQueue(11,
新比较器(){
//实现.compare()和.equals()
});

解决方案是让您的
顶点
类实现
可比较
,或者在构造优先级队列时为其提供一个
比较器
。Java collections框架需要一种比较顶点的方法(毕竟您将它们放入了一个优先级队列中,优先级意味着存在某种排序的必要性)

使用边的权重来确定最佳路径。将顶点发布到
PriorityQueue
将不起作用


我猜你的
Edge
类将通过比较它们的长度来实现
Comparable

看看
OldCurmudgeon
的答案。根据它的说法,在解决这个问题的方法中,您似乎有一个更高层次的设计缺陷。
PriorityQueue<Vertex> vertices = new PriorityQueue<Vertex>(11,
    new Comparator<Vertex>() {
        //implement .compare() and .equals()
    });