1. 程式人生 > 其它 >演算法分析與設計 實驗1-1Kruskal演算法

演算法分析與設計 實驗1-1Kruskal演算法

1、問題:

用Kruskal演算法來實現最小生成樹

2、解析:

Kruskal演算法在找最小生成樹結點之前,需要對邊權重從小到大進行排序。將排序好的權重邊依次加入到最小生成樹中(如果加入時產生迴路就跳過這條邊,加入下一條邊),當加入的邊數為n - 1條後,就找到了這個連通圖的最小生成樹。對於如何判斷有無迴路產生,採用並查集來判斷。

附上選擇邊的過程:
在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述
至此一棵最小生成樹就構建完成了。

3、設計(核心虛擬碼):

Sort(E + 1, E + 1 + m);
For(E : 1 ~ m) {
	If(find(E[i].u) != find(E[i].v))){
	Res += E[i].w;
Num++; F[f1] = f2; } If(num = m - 1) break; }

4、分析:

①、在並查集初始化階段時間複雜度為O(n)
②、在對邊進行從小到大的排序時間複雜度為O(mlogm)
③、在選擇邊的時候時間複雜度為O(m + n)
因為是順序執行,所以綜上所述Kruskal演算法時間複雜度為O(mlogm)

5、原始碼:

Kruskal演算法原始碼