最小生成樹問題 Kruskal

2021-09-29 13:59:23 字數 2761 閱讀 9412

kruskal 演算法

實踐複雜度 

選取的最短邊不構成環,那麼這些邊最後就是最小生成樹的邊

使用union find快速判斷環 

// kruskal演算法求最小生成樹

public class kruskalmst}}

// 建立乙個並查集, 來檢視已經訪問的節點的聯通情況

unionfind uf = new unionfind(graph.v());

while (!pq.isempty() && mst.size() < graph.v() - 1)

// 否則, 將這條邊新增進最小生成樹, 同時標記邊的兩個端點聯通

mst.add(e);

uf.unionelements(e.v(), e.w());

}// 計算最小生成樹的權值

mstweight = mst.get(0).wt();

for (int i = 1; i < mst.size(); i++)

}// 返回最小生成樹的所有邊

list> mstedges()

// 返回最小生成樹的權值

number result()

}

// union-find

public class unionfind

}// 查詢過程, 查詢元素p所對應的集合編號

// o(h)複雜度, h為樹的高度

int find(int p)

return p;

}// 檢視元素p和元素q是否所屬乙個集合

// o(h)複雜度, h為樹的高度

boolean isconnected(int p, int q)

// 合併元素p和元素q所屬的集合

// o(h)複雜度, h為樹的高度

void unionelements(int p, int q)

// 根據兩個元素所在樹的元素個數不同判斷合併方向

// 將元素個數少的集合合併到元素個數多的集合上

最小生成樹問題 minimum span tree

如果橫切邊有相等的邊

kruskal 最小生成樹

include include 產生隨機數組用 include 同上 include using namespace std 1 帶權邊的類myarc class myarc bool operator const myarc arc myarc myarc int beginvex,int end...

最小生成樹Kruskal

最小生成樹有兩個特點,乙個是保證了所有邊的和是最小值,另乙個是保證了所有邊中的最大值最小。struct edge bool friend operator edge a,edge b 構邊 vectoredge int id max int mini void initial void input ...

最小生成樹(kruskal)

kruskal演算法 1 記graph中有v個頂點,e個邊 2 新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊 3 將原圖graph中所有e個邊按權值從小到大排序 4 迴圈 從權值最小的邊開始遍歷每條邊 直至圖graph中所有的節點都在同乙個連通分量中 if 這條邊連線...