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個城市中找出乙個包括全部城市的連通子圖,使得 其全部邊...