Prim的算法,使用优先级队列

时间:2014-11-26 12:10:31

标签: 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> 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;
    }
}

3 个答案:

答案 0 :(得分:2)

Prims algorithm使用边缘的权重来确定最佳路径。将顶点发布到PriorityQueue将无效。

我猜你的Edge课程会通过比较他们的长度来实施Comparable

答案 1 :(得分:0)

是:您需要使用Vertex方法来实施Comparable<Vertex>

Java的PriorityQueue是堆的实现,它具有日志时间插入和最小元素的日志时间删除。但为了使其有意义,你需要有一个最小的概念;这意味着你需要放入PriorityQueue的任何内容Comparable,这样就可以比较堆中的两个元素。

Comparable元素可以插入PriorityQueue的原因是您还可以在构造函数中指定Comparator,而不是使用Comparable元素。因此,作为替代方案,您可以保留Vertex类,但使用适当的构造函数(还需要您指定初始容量):

PriorityQueue<Vertex> vertices = new PriorityQueue<Vertex>(11,
    new Comparator<Vertex>() {
        //implement .compare() and .equals()
    });

答案 2 :(得分:0)

解决方案是让您的Vertex类实现Comparable,或者在构造优先级队列时为其提供Comparator。 Java集合框架需要一种比较顶点的方法(毕竟你将它们放入优先级队列,优先级意味着必须存在某些排序)。