資料結構之最小生成樹 普里姆演算法

2022-09-06 10:57:23 字數 1860 閱讀 7270

1)普里姆演算法

可取圖中任意乙個頂點v作為生成樹的根,之後若要往生成樹上新增頂點w,則在頂點v和頂點w之間必定存在一條邊,並且

該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,假設n個頂點分成兩個集合:u(包含已落在生成樹上

的結點)和v-u(尚未落在生成樹上的頂點),則在所有連通u中頂點和v-u中頂點的邊中選取權值最小的邊。

例如:起始生成樹上面就乙個頂點。為了連通兩個集合,在可選的邊中,選擇權值最小的。需要輔助陣列,v-u中所有頂點。

具體例項如下圖所示:求下圖的最小生成樹 

我們以a點為起始點,此時的u集合=,v-u到u集合的路徑有a-b=4,a-c=2,取最小的a-c,所以將c點新增到u集合中,u=。

此時,v-u到u集合的路徑有b-a=4,b-c=3,取最小,更新b點到u集合的最短路徑為3,此外還有c-d=5,c-h=5,所以,取v-u到u集

合的最小值為b-c=3,將b點新增到u集合中。u=。此時v-u到u集合存在以下點:c-d=5,c-h=5,b-d=5(與現有的c-d=5一樣,

所以不更新,仍舊採用c-d),b-e=9,取最小的,此時可以有兩個選擇,假設選擇c-d,所以將d點新增到u集合中。u=。

此時v-u到u的路徑,因為e-d=7新增加的路徑為d-f和d-g。此時選擇v-u到u集合的最短路徑為d-h=4,所以將h新增到u集合,此時u=。依次不斷選擇

接下來的**示例圖:

**如下:

1 #include "

stdafx.h

"2 #include3 #include

4using

namespace

std;

5 typedef struct

mgraph

6mgraph;

11 typedef struct

closedge

12minside[100

];16

17int locatevex(mgraph g, string u) //

找到則返回i,否則返回-1

1824

25void creategraphudg(mgraph &g) //

構造無向圖

264950}

5152

int minimum(minside sz, mgraph g) //

尋找最小

5366}67

return

k;68}69

70void minispantree_prim(mgraph g, string u)//

prim演算法

7180 closedge[k].lowcost = 0; //

該點用過後權值歸0

8182 cout << "

最小生成樹各邊為:

"<

83for (i = 1; i < g.vexnum; i++)

8495}96

}97}98

99int

main()

100

輸出結果:

關於克魯斯卡爾演算法博主明天會更新,請耐心等待...

資料結構 最小生成樹 普里姆演算法

首先仍然是預定義 1 define ok 1 2 define error 0 3 define max int 32767 4 define mvnum 100 56 typedef int status 7 typedef char vertextype 8 typedef int arctyp...

資料結構 普里姆(Prim)演算法生成最小生成樹

乙個連通圖的生成樹是圖的極小連通子圖,它包含圖中的所有定點,並且只含盡可能少的邊,這意味著對於生成樹來說,就砍去使生成樹變成非連通圖 若給它怎家一條邊就會形成圖中的一條迴路。對於乙個帶權連通無向圖g v,e 生成樹不同,每個樹的權也可能不同。設w為g的所有生成樹的集合,若t為g中邊的權值之和最小的那...

最小生成樹(普里姆演算法)

關於什麼是prim 普里姆演算法 在實際生活中,我們常常碰到類似這種一類問題 如果要在n個城市之間建立通訊聯絡網,則連通n個城市僅僅須要n 1條線路。這時。我們須要考慮這樣乙個問題。怎樣在最節省經費前提 下建立這個通訊網.換句話說,我們須要在這n個城市中找出乙個包括全部城市的連通子圖,使得 其全部邊...