图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

0_12849822668MW5
在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。
在有向图中,通常将边称作弧,含箭头的一端称为弧头,另一端称为弧尾,记作<vi,vj>,它表示从顶点vi到顶点vj有一条边。

稀疏图与稠密图

有很少条边或弧(如e<nlogn,n是图的顶点数,e是弧数)的图称为稀疏图(sparse graph),反之成为稠密图(dense graph)。

数据结构

要表示一个图G=(V,E),有两种标准的方法,即邻接表和邻接矩阵。

邻接矩阵

邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
我们来看一个实例,下图就是一个无向图
Dingtalk_20211116162342
有向网图
Dingtalk_20211116162342

邻接表

邻接表作为图的一种存储方式,在存储稀疏图上相对于邻接矩阵有相当大的空间节省。如一个稀疏图的顶点个个数为n,边数为e。用邻接矩阵存储需要n^2空间,而真正进行存储的只有2e个空间, 剩下的n^2-2e都浪费了。但是对于邻接表来讲,存储空间只需要n+2e个,相对于邻接矩阵减少了很多。邻接表虽然在空间上有很大的优势,但是对于一个有向图,如果需要查找每个顶点的入度就需要遍历整个邻接表,在效率上很低下的。因此才有了逆邻接表的诞生。
邻接表:反映的是顶点出度的情况。
逆邻接表:反映的是顶点的入度情况。

下面举一个例子:
20191122211916187
邻接表:
20191122211916187

逆邻接表:
20191122211916187