最小生成樹 - Kruskal演算法
阿新 • • 發佈:2018-11-12
Kruskal演算法
第二種最小生成樹演算法 —— Kruskal演算法
按照邊的權重順序(從小到大)處理它們,將邊加入最小生成樹中,加入的邊不會與已經加入的邊構成環,直到樹中含有
條邊為止。這些邊逐漸由一片森林合併為一棵樹,也就是圖的最小生成樹。
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; }
}