1. 程式人生 > >最小生成樹 - Kruskal演算法

最小生成樹 - Kruskal演算法

Kruskal演算法

第二種最小生成樹演算法 —— Kruskal演算法
按照邊的權重順序(從小到大)處理它們,將邊加入最小生成樹中,加入的邊不會與已經加入的邊構成環,直到樹中含有 V 1 V-1 條邊為止。這些邊逐漸由一片森林合併為一棵樹,也就是圖的最小生成樹。

Kruskal演算法能夠得到任意加權無向圖的最小生成樹

在這裡插入圖片描述

演算法如下:
使用一條優先佇列pq 來將邊按照權重排序,一個union-find資料結構uf 來識別會形成環的邊,一條佇列mst來儲存最小生成樹的所有邊。

/*
 * 最小生成樹的 Kruskal演算法
 */
public class KruskalMST {
    private Queue<Edge> mst;   //使用一條佇列來儲存最小生成樹的所有邊
    
    public KruskalMST(EdgeWeightedGraph G) {
        mst = new Queue<Edge>();
        MinPQ<
Edge>
pq = new MinPQ<>(); //使用一條優先佇列來儲存還未被檢查的邊 for(Edge e : G.edges()) pq.insert(e); UF uf = new UF(G.V()); //使用一個union-find資料結構來判斷無效的邊 while(!pq.isEmpty() && mst.size() < G.V()-1) { Edge e = pq.delMin(); //從pq得到權重最小的邊和它的頂點
int v = e.either(), w=e.other(v); if(uf.connected(v, w)) //處於同一個連通分量中.忽略失效的邊 continue; uf.union(v, w); //合併分量 mst.enqueue(e); //將邊新增到最小生成樹中 } } public Iterable<Edge> edges() { return mst; } }