解析加權無向圖(內含代碼詳解)

加權無向圖

加權無向圖是一種爲每條邊關聯一個權重值或是成本的圖模型。這種圖能夠自然地表示許多應用。
在一副航空圖中,邊表示航線,權值則可以表示距離或者費用。
在一副電路圖中,邊表示導線,權值則可能表示導線的長度即成本,或是信號通過這條邊需要的時間。
此時我們很容易就能想到,最小成本的問題,例如,從西安飛紐約,怎樣飛才能使時間成本最低或者是金錢成本最低?

在下圖中,從頂點0到頂點4有3條路徑,分別是0-2-3-4,0-2-4,0-5-3-4,那麼我們如果要通過那條路徑到達4頂點最好呢?此時就要考慮那條路徑的成本最低。
如下圖,假如邊上的代表時間:則從0到達4中時間有長有短,如果找到最短的呢?
0-2-3-4:6
0-2-4:10
0-5-3-4:5
在這裏插入圖片描述
加權無向圖邊的表示
加權無向圖中的邊我們就不能簡單的使用v-w兩個頂點表示了,而必須要給邊關聯一個權重值,因此我們可以使用對象來描述一條邊。
API設計:
在這裏插入圖片描述
代碼實現:

public class Edge implements Comparable<Edge>{
    private final int v;//頂點1
    private final int w;//頂點2
    private final double weight;//當前邊的權重

    //通過頂點v和w,以及權重weight構造一個邊對象
    public Edge(int v,int w,double weight){
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    /**
     * 獲取邊的權重值
     * @return
     */
    public double weight(){
        return weight;
    }

    /**
     * 獲取邊上的一個點
     * @return
     */
    public int either(){
        return v;//也可以爲w,如果爲w的話,函數other(int vertex)中的if()條件也需要改變
    }

    /**
     * 獲取除了頂點vertex外的另外一個頂點
     * @param vertex
     * @return
     */
    public int other(int vertex){
        if(vertex == v){
            return w;
        }else {
            return v;
        }
    }

    @Override
    public int compareTo(Edge that){
        //使用一個遍歷記錄比較的結果
        int cmp;
        if(this.weight() > that.weight()){
            //如果當前的權重值大,則讓cmp = 1
            cmp = 1;
        }else if(this.weight() < that.weight()){
            //如果當前邊的權重值小,則讓cmp = -1;
            cmp = -1;
        }else {
            //如果當前邊的權重值和that邊的權重值一樣大,則讓cmp = 0
            cmp = 0;
        }
        return cmp;
    }
}

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