此演算法為Prim演算法完整版。具體prim演算法分析請見
http://blog.csdn.net/yeruby/article/details/38615045
/************************author's email:wardseptember@gmail.comdate:2017.11************************/#include<iostream>#define INF 100//INF為比圖中任何權值都大的數#define maxSize 6using namespace std;typedef struct {//圖的定義 float edges[maxSize][maxSize];//鄰接矩陣的定義 int n, e; //分別為頂點數和邊數}MGraph;MGraph creatGraph(MGraph g);void prim(MGraph g, int v0, float &sum);//prim演算法int main() { MGraph g;//定義並初始化圖g g.edges[maxSize][maxSize] = { 0 }; g.n = maxSize; g.e = 10; g=creatGraph(g);//建立一個圖 float sum; prim(g, 0, sum); cout << "最小產生樹的權值為:"; cout << sum<<endl; return 0;}MGraph creatGraph(MGraph g) {/*此圖的各個頂點為一個正無邊形的頂點,加正中間一個點。正中間一個點與各個頂點相連*/ int i, j; for (i = 0; i < maxSize; i++) { for (j = 0; j < maxSize; j++) { g.edges[i][j] = INF; } } g.edges[0][1] = 6; g.edges[1][0] = 6; g.edges[0][2] = 1; g.edges[2][0] = 1; g.edges[0][3] = 5; g.edges[3][0] = 5; g.edges[1][2] = 4; g.edges[2][1] = 4; g.edges[1][4] = 3; g.edges[4][1] = 3; g.edges[2][3] = 2; g.edges[3][2] = 2; g.edges[2][4] = 7; g.edges[4][2] = 7; g.edges[2][5] = 8; g.edges[5][2] = 8; g.edges[3][5] = 9; g.edges[5][3] = 9; g.edges[4][5] = 11; g.edges[5][4] = 11; g.n = maxSize; g.e = 10; return g;}void prim(MGraph g, int v0, float &sum) { float lowcost[maxSize], vset[maxSize]; /*lowcost[maxSize]用於儲存當前產生樹到剩餘各頂點最短邊的權值, vset[maxSize]用於判斷頂點是否併入產生樹,vset[i]=1表示併入*/ int i, j, k,v ; float min; v = v0; for (i = 0; i < g.n; ++i) {//lowcost存入v0到各頂點的權值,vset初始化 lowcost[i] = g.edges[v0][i]; vset[i] = 0; } vset[v0] = 1;//頂點v0併入樹中 sum = 0; for (i = 0; i < g.n - 1; ++i)//訪問剩餘的n-1個頂點。以下注釋是此迴圈第一趟的注釋,其他的類似 { min = INF; for(j=0;j<g.n;++j)//找到與v0相連的權值中的最小值 if (vset[j] == 0 && lowcost[j] < min) { min = lowcost[j]; k = j; } vset[k] = 1;//將頂點v併入樹 v = k; sum = sum + min;//sum記錄最小產生樹的權值 //更新剛併入樹的頂點v到剩餘各頂點最短邊的權值,與v0相比較 for (j = 0; j < g.n; ++j) if (vset[j] == 0 && g.edges[v][j] < lowcost[j]) lowcost[j] = g.edges[v][j]; }}
以上如有錯誤請立即指出,我立刻改正。