最小生成樹
1.最小生成樹的概念
若從圖的某頂點出發,可以系統地訪問到圖中所有頂點,則遍歷時經過的邊和圖的所有頂點所構成的子圖,稱作該圖的生成樹。(此定義不僅僅適用於無向圖,對有向圖同樣適用。)
(1)若g是強連通的有向圖,則從其中任一頂點v出發,都可以訪問遍g中的所有頂點,從而得到以v為根的生成樹。
(2)若g是有根的有向圖,設根為v,則從根v出發可以完成對g的遍歷,得到g的以v為根的生成樹。
構造生成樹有兩種方法,即深度優先生成樹和廣度優先生成樹。
所謂深度優先生成樹,使用深度優先搜尋方法遍歷乙個連通圖,所經過的邊和頂點構成一棵樹。
廣度優先生成樹是指使用深度優先搜尋方法遍歷乙個連通圖,所經過的邊和頂點構成一棵樹。
圖6-12 (a)、(b)所示的均為圖6-11(a)的無向連通圖的深度優先生成樹和廣度優先生成樹。
(a) 深度優先生成樹 (b) 廣度優先生成樹
圖6-12 無向連通圖g的兩棵生成樹
如果無向連通圖是乙個網,那麼,它的所有生成樹中必有一棵邊的權值總和最小的生成樹,我們稱這棵生成樹為最小生成樹,簡稱為最小生成樹(也稱最小代價生成樹) 。
下面介紹兩種常用的構造最小生成樹的方法。
2.構造最小生成樹的prim演算法
假設g=(v,e)為一網圖,其中v為網圖中所有頂點的集合,e為網圖中所有帶權邊的集合。設定兩個新的集合u和t,其中集合u用於存放g的最小生成樹中的頂點,集合t存放g的最小生成樹中的邊。令集合u的初值為u=(假設構造最小生成樹時,從頂點u1出發),集合t的初值為t={}。prim演算法的思想是,從所有u∈u,v∈v-u的邊中,選取具有最小權值的邊(u,v),將頂點v加入集合u中,將邊(u,v)加入集合t中,如此不斷重複,直到u=v時,最小生成樹構造完畢,這時集合t中包含了最小生成樹的所有邊。
prim演算法可用下述過程描述,其中用wuv表示頂點u與頂點v邊上的權值。
(1)u=,t={};
(2)while (u≠v)do
(u,v)=min
t=t+
u=u+
(3)結束。
圖6-13 (a)所示的乙個網圖,按照prim方法,從頂點1出發,該網的最小生成樹的產生過程如圖6-13(b)、(c)、(d)、(e)、(f)和(g)所示。50 40 55 42 32 35 30 40 20 60
(a) (b) (c)
(d) (e) (f)
(g) (h)
圖6-13 prim演算法構造最小生成樹的過程示意
3.構造最小生成樹的kruskal演算法
單擊檢視
kruskal演算法是一種按照網中邊的權值遞增的順序構造最小生成樹的方法。其基本思想是:設無向連通網為g=(v,e),令g的最小生成樹為t,其初態為t=(v,{}),即開始時,最小生成樹t由圖g中的n個頂點構成,頂點之間沒有一條邊,這樣t中各頂點各自構成乙個連通分量。然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量;若被考察邊的兩個頂點屬於同乙個連通分量,則捨去此邊,以免造成迴路,如此下去,當t中的連通分量個數為1時,此連通分量便為g的一棵最小生成樹。
對於圖6-14(a)所示的網,按照kruskal方法構造最小生成樹的過程如圖6-15所示。在構造過程中,按照網中邊的權值由小到大的順序,不斷選取當前未被選取的邊集中權值最小的邊。依據生成樹的概念,n個結點的生成樹,有n-1條邊,故反覆上述過程,直到選取了n-1條邊為止,就構成了一棵最小生成樹。
(a) (b) (c)
(d) (e) (f)
圖6-14 kruskal演算法構造最小生成樹的過程示意
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...