本章是普里姆演算法的c++實現。普里姆(prim)演算法,是用來求加權連通圖的最小生成樹的演算法。目錄
1. 普里姆演算法介紹
2. 普里姆演算法**
3. 普里姆演算法的**說明
4. 普里姆演算法的原始碼
基本思想
對於圖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...