Kruskal演算法(c 實現)

2021-09-22 16:48:39 字數 2166 閱讀 8170

演算法原理:

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 已找到的最小生成樹其...