簡體   English   中英

Prim的算法,使用優先級隊列

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM