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