演算法原理:
1.將邊的權值從小到大排列;
2.構造輔助陣列root[n](n為節點個數)
3.按照邊的權值從小到大的順序考察各條邊;
4.關鍵:如何判別被考察邊的兩個頂點是否位於兩個連通分量(用到輔助函式);先將輔助函式各項初始化為-1,如果root[i]為-1;則頂點就為該連通分量的「跟」,對於邊(u,v),設v1,v2分別為兩個頂點所在的連通分量的根節點;如果v1不等於v2,則u,v必定位於不同的連通分量,然後令root[v2]=v1;實現樹的合併。當求頂點v所在連通分量的跟節點只需要沿著v=root[v]不斷查詢就行,一直迴圈到root[v]=-1;
5:實現步驟如下:
首先,在初始狀態下,對各頂點賦予不同的標記(用顏色區別),如下圖所示:
(1)對所有邊按照權值的大小進行排序,按照從小到大的順序進行判斷,首先是(1,3),由於頂點 1 和頂點 3 標記不同,所以可以構成生成樹的一部分,遍歷所有頂點,將與頂點 3 標記相同的全部更改為頂點 1 的標記,如(2)所示:
其次是(4,6)邊,兩頂點標記不同,所以可以構成生成樹的一部分,更新所有頂點的標記為:
其次是(2,5)邊,兩頂點標記不同,可以構成生成樹的一部分,更新所有頂點的標記為:
繼續選擇權值最小的邊,此時會發現,權值為 5 的邊有 3 個,其中(1,4)和(3,4)各自兩頂點的標記一樣,如果連線會產生迴路,所以捨去,而(2,3)標記不一樣,可以選擇,將所有與頂點 2 標記相同的頂點的標記全部改為同頂點 3 相同的標記:
當選取的邊的數量相比與頂點的數量小 1 時,說明最小生成樹已經生成。所以最終採用克魯斯卡爾演算法得到的最小生成樹為(6)所示。
**實現(注釋在行後邊):
# include using namespace std;
struct edgetype //關於圖中邊的資訊的結構體
;struct edgegraph //關於整個圖中頂點、邊的所有資訊,需要將前面邊的結構體內容匯入此結構體
;void create(struct edgegraph *myedgegraph); //構造圖的函式函式
void waytoachieve(struct edgegraph *myedgegraph); //演算法實現函式
int findroot(int parent,int v); //尋找各連通分量根的函式
void main()
void create(struct edgegraph *myedgegraph)
for (int i = 0; i < edge; i++)
} }(*myedgegraph).vertexnum = vertex;
(*myedgegraph).edgenum = edge;
for (int i = 0; i < edge; i++)
for (int i = 0; i < vertex; i++)
}void waytoachieve(struct edgegraph *myedgegraph)
for (num = 0, i = 0; i < (*myedgegraph).edgenum; i++)
} }}int findroot(int parent, int v)
return v1;
}
kruskal演算法(C 實現)
templatebool kruskal edgenodet next i,j,c 把邊放到最小堆 minheap h 1 h.initialize e,e,e unionfind u n k 0 while e k n 1 deactivatepos h.deactivate return k n...
kruskal 演算法java實現
public class class kruskal,初始化graphic中點和點的距離,32767表示距離無窮大 另外乙個測試用例是 label new int list graph.length for int i 0 i label.length i 初始化標記 int j int label...
最小生成樹Kruskal演算法實現C 實現
include stdafx.h include define max 100 typedef int weitype using namespace std struct edge 邊集和 edge edge max 已找到的最小生成樹其中一部分的秩 int rank max 已找到的最小生成樹其...