Kruskal(最小生成樹)

java實現Kruskal算法

源代碼
圖的結構java實現
Kruskal

public class Kruskal {
    private static final int INF = Integer.MAX_VALUE;

    /**
     * 初始化距離矩陣
     *
     * @param graph 圖
     * @return 距離矩陣
     */
    private static int[][] initDistance(GraphMatrix graph) {
        int vertexNum = graph.getVertexNum();
        int[][] result = new int[vertexNum][vertexNum];
        // 初始化距離矩陣
        for (int i = 0; i < vertexNum; i++) {
            for (int j = 0; j < vertexNum; j++) {
                result[i][j] = graph.edges[i][j];
                if (i != j && result[i][j] == 0) {
                    result[i][j] = INF;
                }
            }
        }
        return result;
    }

    private static void kruskal(GraphMatrix graph) {
        //頂點個數
        int num = graph.getVertexNum();
        //存放對應頂點所在連通圖標識
        int[] group = new int[num];

        int sum = 0, n1 = 0, n2 = 0;
        boolean finished = false;
        int groupNum = 1;
        int[][] distance = initDistance(graph);
        while (!finished) {
            System.out.print("group:");
            for (int i : group) {
                System.out.print(i + " ");
            }
            System.out.println();
            int min = INF;
            //找出所有邊中最小值
            for (int i = 0; i < num; i++) {
                for (int j = i + 1; j < num; j++) {
                    if (distance[i][j] > 0 && distance[i][j] < min) {
                        //如果group相同,則表示處理過,不相同或都爲0都表示沒處理過
                        if (group[i] != group[j] || (group[i] == 0 && group[j] == 0)) {
                            min = distance[i][j];
                            n1 = i;
                            n2 = j;
                        }
                    }
                }
            }

            if (min == INF) {
                continue;
            }

            System.out.println(graph.vertexList.get(n1) + "->" + graph.vertexList.get(n2) + " " + min);
            sum += min;

            //找到了最小值,設置連通標記
            if (group[n1] == 0 && group[n2] == 0) {
                group[n1] = groupNum;
                group[n2] = groupNum;
                groupNum++;
            } else if (group[n1] > 0 && group[n2] > 0) {
                int tmp = group[n2];
                for (int i = 0; i < group.length; i++) {
                    if (group[i] == tmp) {
                        group[i] = group[n1];
                    }
                }
            } else if (group[n1] == 0) {
                group[n1] = group[n2];
            } else {
                group[n2] = group[n1];
            }

            //檢測是否完成
            finished = true;
            for (int aGroup : group) {
                if (aGroup != group[0]) {
                    finished = false;
                    break;
                }
            }
        }
        System.out.println("sum:" + sum);
    }

    public static void main(String[] args) {
        GraphMatrix<String> graph = new GraphMatrix<>("ABCDEF");
        graph.addEdge("A", "B", 6);
        graph.addEdge("A", "C", 1);
        graph.addEdge("A", "D", 5);
        graph.addEdge("B", "C", 5);
        graph.addEdge("B", "E", 3);
        graph.addEdge("C", "D", 5);
        graph.addEdge("C", "E", 6);
        graph.addEdge("C", "F", 4);
        graph.addEdge("D", "F", 2);
        graph.addEdge("E", "F", 6);
        graph.information();
        kruskal(graph);
    }
}

log

頂點信息:
A B C D E F 
邊表:
A<->B B<->A A<->C C<->A A<->D D<->A B<->C C<->B B<->E E<->B C<->D D<->C C<->E E<->C C<->F F<->C D<->F F<->D E<->F F<->E 
邊的權重表:
0 6 1 5 0 0 
6 0 5 0 3 0 
1 5 0 5 6 4 
5 0 5 0 0 2 
0 3 6 0 0 6 
0 0 4 2 6 0 
group:0 0 0 0 0 0 
A->C 1
group:1 0 1 0 0 0 
D->F 2
group:1 0 1 2 0 2 
B->E 3
group:1 3 1 2 3 2 
C->F 4
group:1 3 1 1 3 1 
B->C 5
sum:15
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章