这篇文章介绍图的两种存储方式:邻接矩阵与邻接表。
在图的存储方式中,不管是哪一种,存储的都是图的顶点信息以及顶点间的关系。
邻接矩阵
邻接矩阵使用两个数组存储图。
- 顶点数组:一维数组
VERTEX
,存放顶点的数据信息。如VERTEX = [v1, v2, v3]
- 邻接矩阵:二维数组
A
,下标表示顶点,元素表示顶点之间的关系。对于A[i][j]
而言,存储的元素代表VERTEX
中顶点i
与顶点j
间的边的信息。
一般而言,在无权图的邻接矩阵中,如果顶点间有边时,存储元素为 1
,无边存放 0
。如无向图 G1
和有向图 G2
的表示方法如下,它们的边都没有权重:

而对于网络(带权图)来说,邻接矩阵元素为边上的权值 ,当无边时,可以用无穷大 ∞ 表示。

邻接矩阵的存储方式有如下特点:
1、无向图的邻接矩阵一定是对称矩阵。按压缩存储的思想,我们可以只用存储上三角或下三角元素。 2、无向图的第 i 行或第 i 列非零元素(或非 ∞ 元素)个数正好是第 i 个顶点的度。 3、有向图的第 i 行或第 i 列非零元素(或非 ∞ 元素)个数正好是第 i 个顶点的出度或入度。
需要重点提出是它与邻接表存储方式的区别:
使用邻接矩阵很容易确认两个顶点间是否存在边,但确认一共多少边必须遍历所有元素,代价较大。
对于 n 个顶点的图,存储邻接矩阵需要 n * n
个存储位置,空间复杂度为 。所以适合稠密图的存储,而不适合稀疏图。
邻接表
邻接表使用顺序存储与链式存储相结合。
- 数组:存放顶点的数据信息。
- 链表:存放边的信息。
邻接表首先由一个数组,存放了所有的顶点结点,以每一个顶点结点作为头结点,又有 n 个链表,分别存放每个顶点依附的边。
同样是上面的 G1、G2 两张图,使用邻接表存储如下:

边结点里的序号指代的是顶点在顶点数组中间的索引。
对于网络来讲,边结点还需存储边的权重。
