[英]Prim's algorithm, using a priority queue
我正在尝试使用优先级队列来实现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;
}
}
Prims算法使用边缘的权重来确定最佳路径。 将顶点发布到PriorityQueue
将不起作用。
我猜测您的Edge
类将通过比较它们的长度来实现Comparable
。
是的:您需要使用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()
});
解决方案是让您的Vertex
类实现Comparable
,或者在构造优先级队列时为优先级队列提供一个Comparator
。 Java集合框架需要一种比较顶点的方法(毕竟,将它们放入优先级队列中,并且优先级意味着必须存在一些排序)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.