課堂筆記 最小生成樹

2021-10-01 03:51:36 字數 2623 閱讀 1955

最小生成樹(minimal spanning tree)

生成樹的代價:設g=(v,e)是乙個無向連通網,生成樹上各邊的權值之和稱為該生成樹的代價。

最小生成樹:在圖g所有生成樹中,代價最小的生成樹稱為最小生成樹。

mst( minimum spanning tree)性質

假設g=(v, e)是乙個無向連通網,u是頂點集v的乙個非空子集。若(u, v)是一條具有最小權值的邊,其中u∈u,v∈v-u,則必存在一棵包含邊(u, v)的最小生成樹。

mst性質的應用

構造最小代價生成樹

兩種方法:prime法:加點法,kruskal方法:加邊法

prim演算法

基本思想

設g=(v, e)是具有n個頂點的連通網,t=(u, te)是g的最小生成樹, t的初始狀態為u=(u0∈v),te=,重複執行下述操作: 在所有u∈u,v∈v-u的邊中找一條代價最小的邊(u, v)併入集合te,同時v併入u,直至u=v。

資料結構設計

陣列lowcost[n]:用來儲存集合v-u中各頂點與集合u中頂點最短邊的權值,lowcost[v]=0表示頂點v已加入最小生成樹中;

陣列adjvex[n]:用來儲存該邊所依附的(集合v-u中各頂點與集合u中頂點的最短邊)集合u中的頂點。

prim演算法——偽**

1、初始化兩個輔助陣列lowcost(=arc[0][i])和adjvex(=0)(0是始點); 2、輸出頂點u0,將頂點u0加入集合u中;

3、重複執行下列操作n-1次

3.1、在lowcost中選取最短邊(lowcost[k]),取對應的頂點序號k;

3.2、輸出頂點k和對應的權值;

3.3、將頂點k加入集合u中(lowcost[k]=0);

3.4、調整陣列lowcost和adjvex;

void prime

(mgraph g)

lowcost[0]

=0;for

(i=1

;i}}

時間複雜性:o(n2),適用於稠密圖。

kruskal演算法

基本思想

1、設無向連通網為g=(v, e),令g的最小生成樹為t=(u, te),其初態為u=v,te=,

2、然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。2.1、若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量;

2.2、若被考察邊的兩個頂點屬於同乙個連通分量,則捨去此邊,以免造成迴路;

3、如此下去,當t中的連通分量個數為1時,此連通分量便為g的一棵最小生成樹。

kruskal演算法思想

1、初始化:u=v; te=;

2、迴圈直到t中的連通分量個數為1

2.1、在e中尋找最短邊(u,v);

2.2、如果頂點u、v位於t的兩個不同連通分量,則

2.2.1、將邊(u,v)併入te;

2.2.2、將這兩個連通分量合併為乙個;

2.3、在e中標記邊(u,v),使得(u,v)不參加後續最短邊的選取;

kruskal演算法實現中的三個關鍵問題

1、圖的儲存結構

採用邊集陣列儲存圖。

2、如何判斷一條邊所依附的兩個頂點在同乙個連通分量中(並查集)

定義parent[i]陣列。陣列分量的值表示頂點i的雙親節點(初值為-1;)

當一條邊(u,v)的兩個頂點的根結不同時,這兩個結點屬於不同的連通分量(利用parent 陣列查詢一棵樹的根節點。當乙個結點n的parent==-1,樹的根節點即為n)

3、如何將一條邊所依附的兩個頂點合併到同乙個連通分量中

要進行聯通分量的合併 ,其中乙個頂點所在的樹的根節點為vex1,另乙個頂點所在的樹的根節點為vex2,則:parent[vex2]=vex1;

int

find

(int

*parent,

int node)

intmain()

sort

(edges, g)

;for

(i=0

;i) parent[i]=-

1;int k=

0,begin,end,count=

0;

cout<<

"next is the mst :"

0;kreturn0;

}

kruskal演算法的時間複雜性分析

邊集陣列排序,時間複雜性o(eloge),在e條邊中選邊,時間複雜性為o(e),因此時間複雜性為o(eloge)

最小生成樹筆記

兩種常用的最小生成樹演算法 普里姆演算法 prim,時間複雜度o n 2 引入乙個輔助陣列,便巧妙實現之 克魯斯卡爾演算法 kruskal 時間複雜度o e log e prim演算法是根據點找邊,適合稠密圖。kruskal演算法一直都是找最小邊,適合稀疏圖。prim演算法的偽 void minis...

最小生成樹 次小生成樹

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

最小生成樹

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