加權圖是一種爲每條邊關聯一個權值或者成本的圖模型
在之前的例子中,鄰接表取得了很好的效果。要表示加權圖,我們只需要擴展一下之前的代碼即可。之前我們直接在鄰接表中存放頂點信息,現在我們改爲存放Edge對象。
package MST;
public class Edge implements Comparable<Edge>{
private final int v;//己方頂點
private final int w;//對方頂點
private final double weight;//權重
public Edge(int v, int w, double weight) {
this.v = v;
this.w = w;
this.weight = weight;
}
public double weight(){
return weight;
}
//返回己方頂點
public int thisSide(){
return v;
}
//返回對方頂點
public int thatSide(int vertex){
if(vertex == v)
return w;
else if(vertex == w)
return v;
else
throw new RuntimeException( "Inconsistent edge");
}
public int compareTo(Edge that){
if(this.weight() < that.weight())
return -1;
else if(this.weight() > that.weight())
return 1;
else
return 0;
}
public String toString(){
return String.format("%d-%d %.2f", v,w,weight);
}
}
下面是無向加權圖的API,跟無向圖的API十分相似。
package MST;
import list.MyArrayList;
public class EdgeWeightGraph {
private final int V;
private int E;
private MyArrayList<Edge>[] adj;//原本是private MyArrayList<Integer>[] adj;
public EdgeWeightGraph(int V) {
this.V = V;
this.E = 0;
adj = (MyArrayList<Edge>[]) new MyArrayList[this.V];
for(int i=0;i<this.V;i++)
adj[i] = new MyArrayList<Edge>();
}
public int V(){
return this.V;
}
public int E(){
return this.E;
}
public void addEdge(Edge e){
adj[e.thisSide()].add(e);
adj[e.thatSide(e.thisSide())].add(e);
E++;
}
public Iterable<Edge> adj(int v){
return adj[v];
}
/**
* 返回所有的邊
* @return
*/
public Iterable<Edge> edges(){
MyArrayList<Edge> list = new MyArrayList<>();
for(int v=0; v<this.V; v++)
for(Edge e:adj[v]){
if(e.thatSide(v) > v)
list.add(e);
}
return list;
}
}
加權有向圖的API也可以簡單得到,我就不給出代碼了。