資料結構筆記(最小生成樹)

2021-09-29 21:52:47 字數 2650 閱讀 6922

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

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

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

構造最小代價生成樹

兩種方法:

prime法:加點法

kruskal方法:加邊法

注意:當連通圖中各邊權值不相等時,最小生成樹唯一;當有相等的權值時最小生成樹可能唯一可能不唯一,具體情況具體分析。

(一)基本思想:

設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演算法——偽**

初始化兩個輔助陣列lowcost(=arc[0][i])和adjvex(=0)(0是始點);

輸出頂點u0,將頂點u0加入集合u中;

重複執行下列操作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}}

(一)基本思想:

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

2、然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。

(1)若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量;

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

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

(二)演算法思想:

初始化:u=v; te=;

迴圈直到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)不參加後續最短邊的選取;

(三)邊集陣列

方法:利用兩個一維陣列;乙個陣列儲存頂點資訊,另外乙個陣列儲存邊及其權

陣列分量包含三個域:邊所依附的兩個頂點,權值

各邊在陣列中的次序可以任意。

1、邊集陣列的實現

struct edge

2、將鄰接矩陣轉化成邊集陣列

edge edges[m]

;//邊的資料結構型別的變數

for( i =

0; i < g-

>vexnum; i++)}

}

(四)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)

;//對邊集陣列進行堆排序,時間複雜性為o(eloge)

for(i=

0;i) parent[i]=-

1;//每個節點分屬於不同的集合

int k=

0,begin,end,count=0;

cout<<

"next is the mst :"

0;kreturn0;

}

資料結構筆記 最小生成樹

edge類,表示邊的資訊 public class edgeimplements comparable public edge edgee 返回第乙個頂點 public int v 返回第二個頂點 public int w 返回權重 public weight weight 給定乙個頂點返回另乙個頂...

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...

資料結構(最小生成樹)

對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...