Java資料結構:最小生成樹---Prim演算法
阿新 • • 發佈:2018-12-16
日常更新資料結構
思想:通過選擇一個根結點,然後遍歷其所有的邊,選擇權重最小的一個邊。然後到達相應的結點,然後再從該邊出發,依舊選擇權重最小的邊到達下一個結點。(目的是為了使A到各個結點的權值和最小)
原圖為上述圖。
過程:A開始遍歷AB,AC,AD。發現AD權值最小,然後選擇AD,從D開始發現DF最小。。。。。。。ADC比ADFC小就用ADC
經過迴圈後,得到如下圖所示的最小生成樹。
上程式碼
public void minSpanTree() { Triple[] mst = new Triple[vertexCount() - 1]; // 最小生成樹的邊集合,邊數為頂點數n-1; for (int i = 0; i < mst.length; i++) { // 儲存首結點到各個結點的權值 mst[i] = new Triple(0, i + 1, this.weight(0, i + 1)); } for (int i = 0; i < mst.length; i++) { // 找出A到各個結點的權值最小的那條邊 int minweight = MAX_WEIGHT, min = 1; for (int j = i + 1; j < mst.length; j++) {//找權值最小的那個 if (mst[j].value < minweight) { minweight = mst[j].value; min = j; } } Triple edge = mst[min]; // 替換原來權值較大的那條邊 mst[min] = mst[i]; mst[i] = edge; int tv = edge.column; // 更新其他結點的權值,由於路徑選擇問題,其他權值也會發生該邊 for (int j = i + 1; j < mst.length; j++) { int v = mst[i].column; int weight = this.weight(tv, v); if (weight < mst[j].value) { //如果新權值小,則替換原權值 mst[j] = new Triple(tv, v, weight); } } } System.out.println("最小生成樹的邊集合為:"); int mincost = 0; for (int i = 0; i < mst.length; i++) { System.out.println(mst[i] + " "); mincost += mst[i].value; } }