1. 程式人生 > >Kruskal演算法(三)之 Java詳解

Kruskal演算法(三)之 Java詳解

/*
 * 克魯斯卡爾(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");
}