最小生成樹算法——克魯斯卡爾算法

繼昨天的普里姆最小生成樹算法後,第二種最小生成樹算法——克魯斯卡爾算法(Kruskal)
package org.tree;

public class KruskalArithmetic {
   
    public static void KruskalArithmetic(DataUnit[] edges,int vertexs){
        int m = 0;
        int n = 0;
        
        // 定義一數組用來判斷邊與邊是否形成環路
        int[] parent = new int[vertexs];
        
        for (int i = 0; i < parent.length; i++) {
            parent = 0;
        }
        
        for (int i = 0; i < edges.length; i++) {
            DataUnit dataUnit = edges;
            n = Find(parent, dataUnit.begin);
            m = Find(parent, dataUnit.end);
            
            //判斷是否該頂點在生成最小生成樹時產生迴路
            if(n!=m){
                parent[n] = m;
                // 以下打出的每條邊,就是我們最小生成樹上的變
                System.out.println("("+dataUnit.begin+","+dataUnit.end+")  "+dataUnit.weight);
            }
            
        }
        
    }

    private static int Find(int[] parent,int f){
        while(parent[f]>0){
            f = parent[f];
        }
        return f;
    }
   
   
    public static void main(String[] args) {
        DataUnit[] edges = new DataUnit[7];
        //權值一定要由小到大,否則結果不是我要要的
        edges[0] = new DataUnit(2, 3, 1);
        edges[1] = new DataUnit(2, 4, 3);
        edges[2] = new DataUnit(0, 1, 4);
        edges[3] = new DataUnit(1, 2, 5);
        edges[4] = new DataUnit(0, 2, 6);
        edges[5] = new DataUnit(3, 4, 7);
        edges[6] = new DataUnit(0, 4, 8);
        
        KruskalArithmetic(edges, 5);
    }
}


/**
* 此數據結構是爲了配合Kruskal算法而定義的
* @author burgess
*/
class DataUnit{
    //爲了方便定義成public
    public int begin;                            //用來存儲起始頂點
    public int end;                             //用來存儲結束頂點
    public int weight;                          //用來存儲權
   
    public DataUnit(int begin, int end, int weight) {
        super();
        this.begin = begin;
        this.end = end;
        this.weight = weight;
    }
   
    //以下略
}


注意:當用Kruskal算法時,請注意所有邊的集合一定要保證權值由小到大,否則,將得不出我們要的最小生成樹答案。
網上這種算法講解很多,我僅僅在註釋上給大家略講了下。希望各位飯友學習愉快。如有錯誤,歡迎指教!!!

此算是我在書上看到的,我僅僅只是將原來的C代碼翻譯成java代碼,所以寫的原創,請勿亂噴,希望大家學習開心!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章