最小生成樹

2022-06-29 10:36:13 字數 1936 閱讀 3465

w(t)=$$\sum_^n$w(u,v),在一給定的無向圖g = (v, e) 中,(u, v) 代表連線頂點 u 與頂點 v 的邊(即),而 w(u, v) 代表此邊的權重,若存在 t 為 e 的子集(即)且為無迴圈圖,使得

的 w(t) 最小,則此 t 為 g 的最小生成樹。

有兩種演算法:分別是kruskal和prim演算法

kruskal:

kruskal總時維護無向圖的最小生成森林,最初森林由兩條邊構成,然後逐漸的去增加邊。

1.從剩餘的邊中選擇權值最小的邊,判斷兩個節點是否在一棵樹中

2.如果是在一棵樹中那麼就掠過這條邊,重複步驟1

3.若這兩個節點不是在一棵樹中,把該條邊加入生成森林當中。

例子: 

n=5,m=7

edge(分別表示兩個節點和邊值):

1 2 5

2 3 7

2 4 8

4 5 11

3 5 7

1 5 6

4 2 12

step1:邊長最小的5,兩個不在乙個樹中,加入                      step2:選擇邊長最小的6,兩點也不在一棵樹中,加入                           

step3:權值最小的7,選擇2和3              step4:3和5在乙個樹中,所以不選  

step5:選擇邊權為8的邊,加入,選購了n-1條邊,所以結束。

prim演算法總是維護最小生成樹的一部分。

1.設已經確定屬於最小生成樹的節點集合為t(初始時候節點包含1),剩餘邊的集合為s。

2.找到一條邊兩個端點x,y分別在t和s中,且是權值最小的邊,將y從s中去除,加入到t中,並加上權值。

3.重複2。

例子:n=5,m=7

edge(分別表示兩個節點和邊值):

}kruskal複雜度o(mlog m) (適合稀疏圖)

prim複雜度o(n^2),堆優化能達到o(n^2) (適合稠密圖)

github位址

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...