kruskal演算法的實現:
根據最一般的kruskal
演算法的實現原理,本人設計並實現的演算法如下:首先在此演算法中,選邊的過程中,要首先對存在邊按權值按非遞減的順序排列,以順序判斷並加入最小生成樹邊的集合。 因此設計資料結構:
typedef struct myedge, *eptr;
在此資料結構中,alg_edge
指向所有邊的資料集合,為在堆上的一維陣列,並對此陣列用快速排序進行排序。得到的結果為選邊並記錄入
mst[g
—>size-1]
這一存放最小生成樹的陣列做好準備。
對vertag
陣列,首先標記各頂點屬於不同的集合,亦即圖中每個頂點屬於不同的集合。然後自權值最小邊開始,凡是頂點屬於不同的集合的邊均可選入,選入後,兩頂點所屬的不同集合,合併成乙個集合,可以肯定在所有邊都被檢查一遍後,可被選入的邊數為
v-1 ,以v
表示圖的頂點數。恰好
mst陣列記錄的正是最小生成樹的各邊,因為邊已按非遞減的順序檢查。
快排雖然具有不穩定性,但對於最小生成樹的找到無影響,因為最小生成樹的權值相同,如果排列順序變化均能,一方入最小生成樹邊,則說明最小生成樹不唯一。
prime演算法的實現:
prime演算法極其類似
dijikstra
演算法,兩者都要維護更新不在已知滿足要求(分別對應可以加入最小生成樹和已知最短路徑)的頂點集合中頂點的
key值,並且從中算出最小值,作為下乙個找到的滿足要求的頂點,且併入已知的滿足要求頂點的集合。同時,唯一的區別是,
dijikstra
演算法僅需知道對應頂點到源點的距離,而
prime
演算法則需知道對應頂點到已在最小生成樹中各頂點的最小可能距離。兩個
key值都會隨頂點的加入,同步更新,同時也是期望得到的結果資料集合中必不可少的資料之一。因此設計資料結構如下:
typedef struct myvertex, *vptr;
此時的資料中均有兩個頂點,和乙個權值,乍一看與kruskal
演算法的資料結構相似,但兩者在運用時,初始化陣列的出發點乙個是權值
w,另乙個是頂點
ver,亦即在建立選邊的初始資料時,
kruskal
演算法需要建立乙個邊數大小的陣列,然後從中選邊,然而
prime
演算法僅需建立乙個頂點數大小的陣列,然後從中選邊,類似於
dijikstra
演算法;雖然最終選邊的依據都是邊權值(
kruskal
演算法的這一步在排序中體現)。
最小生成樹(兩種演算法)
ifndef min tree h define min tree h include include include include include data struct data struct.h include tool tool disjoint set.h 最小生成樹 假設圖中的頂點有n...
最小生成樹兩種解法
運用了貪心的演算法。是從某個頂點開始不斷新增邊的演算法。int cost max v max v 存邊權 int mincost max v 從集合x出發的邊到每個頂點的最小權值 int book max v int v intprim mincost 0 0 int res 0 while 1 i...
最小生成樹 兩種常見的寫法
普利姆最小生成樹演算法 普里姆演算法 prim演算法 圖論中的一種演算法,可在加權連通圖里搜尋 最小生成樹 意即由此演算法搜尋到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點 英語 vertex graph theory 且其所有邊的權值之和亦為最小。1 輸入 乙個加權連通圖,其中頂點集合為v,...