C 最小生成樹

2022-03-11 21:42:25 字數 1277 閱讀 8992

樹是指沒有環路的圖,生成樹就是指乙個圖上面刪除一些邊,使它沒有環路。

最小生成樹就是指生成樹中邊權之和最小的那一種。

上圖的最小生成樹就是這樣:

就以上圖為例:

先選擇乙個起始點,我們就以a為例。

建立乙個集合s,用來儲存已經在樹中間的點。開始時集合那只有點a,即 \(s = \\)。

選擇乙個連通到集合s中乙個點的最小邊,其中它的另乙個端點不在集合s中。以保證,最小生成樹不會形成環。把這條邊的不在s集合中的端點加到s集合中。(目前選邊ab, \(s = \\))

重複步驟三,直到所有的點都在s集合中了。

答案就是剛才所選的邊的邊權和啦。

時間複雜度: \(o(nm+m)\)

這個演算法的時間的主要瓶頸就是在我們尋找那一條邊的邊權最小的時候,那麼注意到這裡其實是可以通過堆優化的。**如下:

int ans = 0;

int index = 1;

h.push(point(0, 1));

while (index <= n)

}}

時間複雜度: \(o(n\log m + m)\)

還是以上圖為例:

首先第一步最開始,先給邊排序。

選擇乙個邊權最小的邊,判斷它的兩個端點是否原來已經連通,如果沒有連通的話,就選這條邊。以保證這個樹上不會出現迴路。

重複步驟二,直到選出\(n-1\)條邊為止.

上面流程得到的樹就是最小生成樹。

時間複雜度:\(o(n^2)\)

演算法的主要時間瓶頸就是在如何判斷原來兩個點已經連通,如果用dfs或者bfs的話,效率較低,所以我們這裡使用並查集優化。

sort(e.begin(), e.end(), cmp);

int index = 1, np = 0;

int ans = 0;

while (index <= n - 1)

時間複雜度:\(o(m \log m+m \alpha (n))\)

by szdytom

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...