1 定义
在实际生活中,很多图都具有方向性,比如互联网,从A页面通过链接跳转到B页面,A和B的连接就有方向A->B,就需要使用有向图来表达。

定义:有向图是具有方向性的图,由一组顶点和一组有方向的边组成,每条方向的边都连着一对有序的顶点。
2 相关术语
- 出度:由某个顶点指出的边的个数;
- 入度:指向某个顶点的边的个数;
- 有向路径:由一系列顶点组成,其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点;
- 有向环:至少含有一条边,且起点和终点相同的有向路径;

两个顶点v和w可能存在的4种关系:
- 没有边相连;
- 存在从v到w的边v->w;
- 存在从w到v的边w->v;
- 既存在v->w,也存在w->v,即双向连接;
3 Java实现
public class Digraph {
//顶点数目
private final int V;
//边的数目
private int E;
//邻接表
private Deque<Integer>[] adj;
public Digraph(int V){
//初始化顶点数量
this.V = V;
//初始化边的数量
this.E = 0;
//初始化邻接表
this.adj = new Deque[V];
for (int i = 0; i < adj.length; i++) {
adj[i] = new LinkedList<>();
}
}
//获取顶点数目
public int V(){
return V;
}
//获取边的数目
public int E(){
return E;
}
//向有向图中添加一条边 v->w
public void addEdge(int v, int w) {
//只需要让顶点w出现在顶点v的邻接表中,因为边是有方向的,最终,顶点v的邻接表中存储的相邻顶点的含义是: v->其他顶点
adj[v].offer(w);
E++;
}
//获取由v指出的边所连接的所有顶点
public Deque<Integer> adj(int v){
return adj[v];
}
//该图的反向图
private Digraph reverse(){
//创建有向图对象
Digraph r = new Digraph(V);
for (int v=0; v<V; v++){
//获取由该顶点v指出的所有边
for (Integer w : adj[v]) {//原图中表示的是由顶点v->w的边
r.addEdge(w,v);//w->v
}
}
return r;
}
}
本文介绍了有向图的基本概念及其在Java中的实现方法,包括有向图的定义、相关术语如出度和入度等,并详细展示了如何用邻接表实现有向图结构。

270

被折叠的 条评论
为什么被折叠?



