有向图的相关术语及实现
前言
本文介绍什么是有向图,有向图的相关术语及有向图基于邻接表存储结构的代码实现。
一、什么是有向图
有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。
二、有向图的相关术语
- 出度:由某个顶点指出的边的个数称为该顶点的出度。
- 入度:指向某个顶点的边的个数称为该顶点的入度。
- 有向路径:由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。
- 有向环:一条至少含有一条边,且起点和终点相同的有向路径。
- 一副有向图中两个顶点v和w可能存在以下四种关系:
1.没有边相连;
2.存在从v到w的边v—>w;
3.存在从w到v的边w—>v;
4.既存在w到v的边,也存在v到w的边,即双向连接;
三、有向图的代码实现
// 有向图 数据结构(邻接表的思想进行实现)
public class DirectGraph {
private final int V;//记录顶点数量
private int E;//记录边数量
private Queue<Integer>[] adj; //邻接表
public DirectGraph(int V)
{
this.V=V;
this.E=0;
this.adj=new Queue[V];
for (int i = 0; i < V; i++) {
adj[i]=new Queue<Integer>();
}
}
//获取图中顶点的数量
public int V()
{
return V;
}
//获取图中边的数量
public int E()
{
return E;
}
//向有向图中添加一条边 v->w
public void addEdge(int v,int w)
{
//1.将顶点w添加到v的邻接表中,因为是无向表,不用同时将v添加到w的邻接表中
adj[v].enqueue(w);
//2.边个数+1
E++;
}
//获取由v指出的边所连接的所有顶点
public Queue<Integer> adj(int v)
{
return adj[v];
}
//该图的反向图
private DirectGraph reverse()
{
DirectGraph directGraph = new DirectGraph(V);
//遍历所有顶点的邻接表,将邻接表中每个顶点构建新的反向边添加到directGraph
for (int v = 0; v < V; v++) {
for (Integer w : adj[v]) { //v->w
directGraph.addEdge(w,v); //w->v
}
}
return directGraph;
}
}