圖的最小生成樹,普利姆演算法
阿新 • • 發佈:2020-07-09
//Prim演算法生成最小生成樹 void MiniSpanTree_prim(MGraph G) { int min, i, j, k; int adjvex[MAXVEX]; //儲存相關頂點下標 int lowcost[MAXVEX]; //儲存相關頂點間邊的權值 lowcost[0] = 0; //初始化第一個權值為0,即將v0加入生成樹 //lowcost的值為0表示此下標的頂點已經加入生成樹 adjvex[0] = 0; //初始化第一個頂點下標為0 for (i = 1; i < G.numVertexes;i++) { lowcost[i] = G.arc[0][i]; //將v0頂點與之有關的邊的權值都存放入權值陣列 adjvex[i] = 0; //初始化都為v0的下標 } for (i = 1; i < G.numVertexes;i++) { min = INFINITY; j = 1; k = 0; while (j<G.numVertexes) { if (lowcost[j]!=0&&lowcost[j]<min) { //如果權值不為0且權值小於min min = lowcost[j]; //則讓當前權值成為最小值 k = j; //將當前最小值的下標存放k } j++; } printf("(%d,%d)", adjvex[k], k); //列印當前頂點邊中權值最小邊 lowcost[k] = 0;//將當前頂點的權值置為0,表示此頂點已經完成任務 //和上面做了幾乎一樣的操作,就是更新權值 for (j = 1; j < G.numVertexes;j++) //迴圈所有頂點,因為我們已經確認第一個放入的0,所有我們迴圈可以省去0 { if (lowcost[j] != 0 && G.arc[k][j]<lowcost[j]) //如果j頂點還沒找到“與j頂點相連的最小邊權值的頂點k2” 且 當前k頂點與j頂點邊權值小於之前的"j頂點與k1頂點的邊權值" { lowcost[j] = G.arc[k][j]; //將較小權值存入lowcost,表明頂點j與k相連的邊權值; adjvex[j] = k; //將下標為k的頂點存入adjvex,表明頂點j與k相連; } } } } 程式碼作者:山上有風景 ----部落格:https://www.cnblogs.com/ssyfj/p/9488723.html
以下為例項圖片和陣列:
PS:暫時沒時間畫圖,有空再搞