最小生成樹(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...