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 這條邊連線...