加权有向图
加权无向图中,边是没有方向的,并且同一条边会同时出现在该边的两个顶点的邻接表中,为了能够处理含有方向性的图的问题,我们需要实现以下加权有向图。
1. 加权有向图边的表示
API设计:
类名 | DirectedEdge |
---|---|
构造方法 | DirectedEdge(int v,int w,double weight):通过顶点v和w,以及权重weight值构造一个边对象 |
成员方法 | 1.public double weight():获取边的权重值 2.public int from():获取有向边的起点 3.public int to():获取有向边的终点 |
成员变量 | 1.private fifinal int v:起点 2.private fifinal int w:终点 3.private fifinal double weight:当前边的权重 |
代码:
/**
* 加权有向图边表示
*/
public class DirectedEdge {
// 起点
private final int v;
// 终点
private final int w;
// 当前边的权重
private final double weight;
// 通过顶点v和w,以及权重weight值构造一个边对象
public DirectedEdge(int v, int w, double weight) {
this.v = v;
this.w = w;
this.weight = weight;
}
// 获取边的权重值
public double weight() {
return weight;
}
// 获取有向边的起点
public int from() {
return v;
}
// 获取有向边的终点
public int to() {
return w;
}
}
2. 加权有向图的实现
API设计:
类名 | EdgeWeightedDigraph |
---|---|
构造方法 | EdgeWeightedDigraph(int V):创建一个含有V个顶点的空加权有向图 |
成员方法 | 1.public int V():获取图中顶点的数量 2.public int E():获取图中边的数量 3.public void addEdge(DirectedEdge e):向加权有向图中添加一条边e 4.public Queue adj(int v):获取由顶点v指出的所有的边 5.public Queue edges():获取加权有向图的所有边 |
成员变量 | 1.private fifinal int V: 记录顶点数量 2.private int E: 记录边数量 3.private Queue[] adj: 邻接表 |
代码:
package cn.itcast.algorithm.图.有向图.加权有向图;
import cn.itcast.algorithm.线性表.Queue;
public class EdgeWeightedDigraph {
// 顶点总数
private final int V;
// 边的总数
private int E;
// 邻接表
private Queue<DirectedEdge>[] adj;
// 创建一个含有V个顶点的空加权有向图
public EdgeWeightedDigraph(int v) {
// 初始化顶点总数
this.V = v;
// 初始换边数
this.E = 0;
// 初始化邻接表,以及其中的空队列
this.adj = new Queue[V];
for (int i = 0; i < adj.length; i++) {
adj[i] = new Queue<DirectedEdge>();
}
}
// 获取图中顶点的数量
public int V() {
return V;
}
// 获取图中边的数量
public int E() {
return E;
}
// 向加权有向图中添加一条边e
public void addEdge(DirectedEdge e) {
// 获取有向边的起点
int v = e.from();
// 向v的邻接表中添加边
adj[v].enqueue(e);
// 边数+1
E++;
}
// 获取由顶点v指出的所有的边
public Queue<DirectedEdge> adj(int v) {
return adj[v];
}
// 获取加权有向图的所有边
public Queue<DirectedEdge> edges() {
// 创建一个队列,存储所有的边
Queue<DirectedEdge> allEdge = new Queue<>();
// 遍历顶点,拿到每个顶点的邻接表
for (int v = 0; v < this.V; v++) {
// 遍历邻接表,拿到邻接表中的每条边存储到队列中
for (DirectedEdge e : adj[v]) {
allEdge.enqueue(e);
}
}
return allEdge;
}
}