(最小生成樹)prim演算法

2021-08-22 15:00:13 字數 2979 閱讀 1971

思想參考:

總結一下:

如果選 0為起點,low_cost[i]表示以 0這個起點到i 這個終點的權值,我們找最小的權值的終點i,然後以i為起點,去更新low_cost這個陣列,如果與i相連的數是j,現在有兩種情況,j與0相連,j與i相連但不與0相連。如果j也與0相連,我們找0到j和i到j這兩者的最小距離,然後用這個最小的距離更新low_cost[j]。如果j不與0相連,那麼就直接填上low_cost[j]

**分析一下:

matrix[i][j]=m意思是以i為起點j為終點的權值為m

path[i]=a,意思是i起點連的是a終點

由此我們可見陣列可以表達的意思可以是那幾個變數之間的相關性

visit陣列存的是目前最小生成樹上已經有的結點,我們最小生成樹最終是要有所有的結點的

先找乙個起點,然後把與起點相連的路徑都存到low_cost裡

找乙個終點,起點到他的權值最小,將這個終點進行標記(證明已經將其加入到最小生成樹裡面了),並且記錄最小路徑和的sum要加上他的權值

由於low_cost目前只存了與起點相連的路徑,現在最小生成樹裡面加入了乙個新的結點,那麼我們就需要更新low_cost陣列,把與這個新的結點相連的路徑加入到low_cost陣列裡,路徑就要考慮終點,這個終點一定不是在最小生成樹里的,所以要用到visit陣列,然後如果matrix[min_cost_index][j]就是這個新節點到某一終點的權值比low_cost[j]小的話,就更新low_cost[j]

#include

using namespace std;

int matrix[

100]

[100];

// 鄰接矩陣

bool visited[

100]

;// 標記陣列

int low_cost[

100]

;// 邊的權值

int path[

100]

;// 記錄生成樹的路徑

int source;

// 指定生成樹的起點

int vertex_num;

// 頂點數

int edge_num;

// 邊數

int sum;

// 生成樹權和

void

prim

(int source)

int min_cost;

// 權值最小

int min_cost_index;

// 權值最小的下標

sum =0;

for(

int i =

1; i < vertex_num; i++

)// 除去起點,還需要找到另外 vertex_num-1 個點

} visited[min_cost_index]

= true;

// 該點已找到,進行標記

sum +

= low_cost[min_cost_index]

;// 更新生成樹權和

for(

int j =

0; j < vertex_num; j++

)// 從找到的最小下標更新 low_cost 陣列}}

}int

main()

cout <<

"請輸入起點(<"

<< vertex_num <<

"):"

; cin >> source;

prim

(source)

; cout <<

"最小生成樹權和為:"

<< sum << endl;

cout <<

"最小生成樹路徑為:\n"

;for

(int i =

0; i < vertex_num; i++)if

(i != source)

cout << i <<

"----"

<< path[i]

<< endl;

return0;

}/*請輸入圖的頂點數(<=100):5

請輸入圖的邊數:7

請輸入邊的資訊:

0 1 8

0 2 3

0 3 2

1 3 3

3 2 4

2 4 1

3 4 5

請輸入起點(<5):0

最小生成樹權和為:9

最小生成樹路徑為:

1----3

2----0

3----0

4----2

*/

不過上面這個適合理解不適合去作為模板

因為往往下標從一開始

這有乙個模板

#include

#include

#include

using namespace std;

#define n 150

#define inf 99999999

int ma[n]

[n];

long

long d[n]

,vis[n]

;int n;

long

long

prim

(int s)

vis[v]=1

; ans+

=maxn;

for(

int j=

1; j<=n; j++)if

(!vis[j]

&&ma[v]

[j]) d[j]

=ma[v]

[j];

}return ans;

}main那裡面

先輸入陣列ma

然後long

long ans=

prim(1

);printf

("%lld\n"

,ans)

;

最小生成樹(prim演算法)

最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...

最小生成樹 Prim演算法

prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...

最小生成樹 prim 演算法

一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...