15、有向图
15.1、有向图的定义及相关术语
定义:有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点
-
出度
由某个顶点指出的边的个数称为该顶点的出度
-
入度
指向某个顶点的边的个数称为该顶点的入度
-
有向路径
由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点
-
有向环
一条至少含有一条边,且起点和终点相同的有向路径
一副有向图中两个顶点v和w可能存在以下四种关系:
- 没有边相连
- 存在从v到w的边 v—>w
- 存在从w到v的边 w—>v
- 既存在w到v的边,也存在v到w的边,即双向连接
理解有向图是一件比较简单的,但如果要通过眼睛看出复杂有向图中的路径就不是那么容易了
15.2、有向图API设计
在api中设计了一个反向图,因为有向图的实现中,用adj方法获取出来的是由当前顶点v指向的其他顶点,如果能得到其反向图,就可以很容易得到指向v的其他顶点
package chapter15;
import chapter03.Queue;
/**
* @author 土味儿
* Date 2021/9/15
* @version 1.0
* 有向图
*/
public class Digraph {
/**
* 顶点数量
*/
private final int vNum;
/**
* 边数量
*/
private int eNum;
/**
* 邻接表
*/
private Queue<Integer>[] adj;
/**
* 构造器
*
* @param vNum
*/
public Digraph(int vNum) {
// 初始化顶点数量
this.vNum = vNum;
// 初始化边数量
this.eNum = 0;
// 初始化邻接表
this.adj = new Queue[vNum];
// 初始化邻接表中的空队列
for (int i = 0; i < vNum; i++) {
this.adj[i] = new Queue<Integer>();
}
}
/**
* 得到顶点数量
*
* @return
*/
public int getVNum() {
return vNum;
}
/**
* 得到边数量
*
* @return
*/
public int geteNum() {
return eNum;
}
/**
* 添加一条边v-w
*
* @param v
* @param w
*/
public void addEdge(int v, int w) {
// 因为是有向图,w加入到v的链表中
this.adj[v].enQueue(w);
//this.adj[w].enQueue(v);
// 边数量加1
eNum++;
}
/**
* 获取顶点v指出的边的所有顶点
*
* @param v
* @return
*/
public Queue<Integer> adj(int v)