Kruskal演算法(三)之 Java詳解
阿新 • • 發佈:2018-12-30
/* * 克魯斯卡爾(Kruskal)最小生成樹 */ public void kruskal() { int index = 0; // rets陣列的索引 int[] vends = new int[mEdgNum]; // 用於儲存"已有最小生成樹"中每個頂點在該最小樹中的終點。 EData[] rets = new EData[mEdgNum]; // 結果陣列,儲存kruskal最小生成樹的邊 EData[] edges; // 圖對應的所有邊 // 獲取"圖中所有的邊" edges = getEdges(); // 將邊按照"權"的大小進行排序(從小到大) sortEdges(edges, mEdgNum); for (int i=0; i<mEdgNum; i++) { int p1 = getPosition(edges[i].start); // 獲取第i條邊的"起點"的序號 int p2 = getPosition(edges[i].end); // 獲取第i條邊的"終點"的序號 int m = getEnd(vends, p1); // 獲取p1在"已有的最小生成樹"中的終點 int n = getEnd(vends, p2); // 獲取p2在"已有的最小生成樹"中的終點 // 如果m!=n,意味著"邊i"與"已經新增到最小生成樹中的頂點"沒有形成環路 if (m != n) { vends[m] = n; // 設定m在"已有的最小生成樹"中的終點為n rets[index++] = edges[i]; // 儲存結果 } } // 統計並列印"kruskal最小生成樹"的資訊 int length = 0; for (int i = 0; i < index; i++) length += rets[i].weight; System.out.printf("Kruskal=%d: ", length); for (int i = 0; i < index; i++) System.out.printf("(%c,%c) ", rets[i].start, rets[i].end); System.out.printf("\n"); }