Prim演算法 二 之 C 詳解

2021-10-01 14:23:14 字數 2500 閱讀 1637

本章是普里姆演算法的c++實現。

目錄

1. 普里姆演算法介紹

2. 普里姆演算法**

3. 普里姆演算法的**說明

4. 普里姆演算法的原始碼

普里姆(prim)演算法,是用來求加權連通圖的最小生成樹的演算法。

基本思想

對於圖g而言,v是所有頂點的集合;現在,設定兩個新的集合u和t,其中u用於存放g的最小生成樹中的頂點,t存放g的最小生成樹中的邊。 從所有uєu,vє(v-u) (v-u表示出去u的所有頂點)的邊中選取權值最小的邊(u, v),將頂點v加入集合u中,將邊(u, v)加入集合t中,如此不斷重複,直到u=v為止,最小生成樹構造完畢,這時集合t中包含了最小生成樹中的所有邊。

以上圖g4為例,來對普里姆進行演示(從第乙個頂點a開始通過普里姆演算法生成最小生成樹)。

初始狀態:v是所有頂點的集合,即v=;u和t都是空!

第1步:將頂點a加入到u中。

此時,u=。

第2步:將頂點b加入到u中。

上一步操作之後,u=, v-u=;因此,邊(a,b)的權值最小。將頂點b新增到u中;此時,u=。

第3步:將頂點f加入到u中。

上一步操作之後,u=, v-u=;因此,邊(b,f)的權值最小。將頂點f新增到u中;此時,u=。

第4步:將頂點e加入到u中。

上一步操作之後,u=, v-u=;因此,邊(f,e)的權值最小。將頂點e新增到u中;此時,u=。

第5步:將頂點d加入到u中。

上一步操作之後,u=, v-u=;因此,邊(e,d)的權值最小。將頂點d新增到u中;此時,u=。

第6步:將頂點c加入到u中。

上一步操作之後,u=, v-u=;因此,邊(d,c)的權值最小。將頂點c新增到u中;此時,u=。

第7步:將頂點g加入到u中。

上一步操作之後,u=, v-u=;因此,邊(f,g)的權值最小。將頂點g新增到u中;此時,u=v。

此時,最小生成樹構造完成!它包括的頂點依次是:a b f e d c g

以"鄰接矩陣"為例對普里姆演算法進行說明,對於"鄰接表"實現的圖在後面會給出相應的原始碼。

1. 基本定義

class matrixudg ;
matrixudg是鄰接矩陣對應的結構體。

mvexs用於儲存頂點,mvexnum是頂點數,medgnum是邊數;mmatrix則是用於儲存矩陣資訊的二維陣列。例如,mmatrix[i][j]=1,則表示"頂點i(即mvexs[i])"和"頂點j(即mvexs[j])"是鄰接點;mmatrix[i][j]=0,則表示它們不是鄰接點。

2. 普里姆演算法

/*

* prim最小生成樹

* * 引數說明:

* start -- 從圖中的第start個元素開始,生成最小樹

*/void matrixudg::prim(int start)

j++;

}// 經過上面的處理後,在未被加入到最小生成樹的頂點中,權值最小的頂點是第k個頂點。

// 將第k個頂點加入到最小生成樹的結果陣列中

prims[index++] = mvexs[k];

// 將"第k個頂點的權值"標記為0,意味著第k個頂點已經排序過了(或者說已經加入了最小樹結果中)。

weights[k] = 0;

// 當第k個頂點被加入到最小生成樹的結果陣列中之後,更新其它頂點的權值。

for (j = 0 ; j < mvexnum; j++)

}// 計算最小生成樹的權值

sum = 0;

for (i = 1; i < index; i++)

{min = inf;

// 獲取prims[i]在mmatrix中的位置

n = getposition(prims[i]);

// 在vexs[0...i]中,找出到j的權值最小的頂點。

for (j = 0; j < i; j++)

{m = getposition(prims[j]);

if (mmatrix[m][n]

這裡分別給出"鄰接矩陣圖"和"鄰接表圖"的普里姆演算法原始碼。

1. 鄰接矩陣原始碼(matrixudg.cpp)

2. 鄰接表原始碼(listudg.cpp)

Prim演算法詳解

prim演算法是幹什麼的?prim演算法可以計算出乙個無向加權圖的最小生成樹 什麼是最小生成樹?首先,樹兩個最重要的性質是 用一條邊連線樹中的任意兩點都會產生乙個新的環 從樹中刪除一條邊將會得到兩棵獨立的樹,最小生成樹即為連線圖中所有點,且總權重最小的樹。最小生成樹的性質 將圖中的點分為兩個集合,橫...

最小生成樹之Prim演算法詳解

普里姆演算法 prim演算法 圖論中的一種演算法,可在 加權連通圖 裡搜尋最小生成樹。意即由此演算法搜尋到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點 英語 vertex graph theory 且其所有邊的權值之和亦為最小。演算法思想 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e...

prim演算法(C 實現)

templatebool prim edgenodet initializepos int v t w vertexnode2vn2 modifiedminheap h h new modifiedminheap n first 1,v,w while v for int i 0 i n 1 i c...