1. 程式人生 > >Java資料結構:最小生成樹---Prim演算法

Java資料結構:最小生成樹---Prim演算法

日常更新資料結構

思想:通過選擇一個根結點,然後遍歷其所有的邊,選擇權重最小的一個邊。然後到達相應的結點,然後再從該邊出發,依舊選擇權重最小的邊到達下一個結點。(目的是為了使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;
		}
	}