1.知识储备
2.边的实现:
package Graph;
public class DirectedEdge {
//起点
private final int v;
//终点
private final int w;
//权重
private final double weight;
//通过起点、终点、和权重构建一条有向边的对象
public DirectedEdge(int v,int w,double weight) {
// TODO Auto-generated constructor stub
this.v=v;
this.w=w;
this.weight=weight;
}
//获取边的权重值
public double weight(){
return weight;
}
//获取有向边的起点
public int from(){
return v;
}
//获取有向边的终点
public int to(){
return w;
}
}
3.加权有向图的实现:
package Graph;
import Queue.Queue;
public class EdgeWeightedDiGraph {
//顶点总数
private final int V;
//边的总数
private int E;
//邻接表
private Queue<DirectedEdge>[] adj;
//创建一个含有V个顶点的加权有向图
public EdgeWeightedDiGraph(int v) {
// TODO Auto-generated constructor stub
this.V=v;
this.E=0;
this.adj=new Queue[V];
for(int i=0;i<V;i++){
adj[i]=new Queue<DirectedEdge>();
}
}
//获取顶点数量
public int V(){
return V;
}
//获取边的数量
public int E(){
return E;
}
//向加权有向图中添加一条边
public void addEdge(DirectedEdge e){
//边e是有方向的, 只需要让边出现在起点的邻接表中即可
int v=e.from();
adj[v].InQueue(e);
E++;
}
//获取由顶点v指出的所有边
public Queue<DirectedEdge> adj(int v){
return adj[v];
}
//获取加权有向图的所有边
public Queue<DirectedEdge> Edges(){
//遍历图中的每一个顶点,得到该顶点的邻接表,遍历得到每一条边,添加到队列中返回即可
Queue<DirectedEdge> allEdges=new Queue<>();
for(int v=0;v<V;v++){
for(DirectedEdge edge:adj[v]){
allEdges.InQueue(edge);
}
}
return allEdges;
}
}