加权无向图
加权无向图是一种为每条边关联一个权重值或是成本的图模型。这种图能够自然地表示许多应用。
在一副航空图中,边表示航线,权值则可以表示距离或者费用。
在一副电路图中,边表示导线,权值则可能表示导线的长度即成本,或是信号通过这条边需要的时间。
此时我们很容易就能想到,最小成本的问题,例如,从西安飞纽约,怎样飞才能使时间成本最低或者是金钱成本最低?
在下图中,从顶点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;
}
}