[英]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.