开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
1、写在前面
大家好,今天文章的内容是:
- 图的存储结构:邻接矩阵
要存储一张图,除了保存各个顶点本身的数据信息之外,还需要存储顶点之间的关联信息,也就是边的信息,图中的两个顶点是否可达,是否有边等等,因此对于图结构来说,其存储结构是很重要的。
2、内容
图的邻接矩阵表示法如下:
假设现在有一个图,需要存储个顶点信息以及个边的信息,这时我们就可以用一个的二维数组来存储顶点之间的邻接关系,用一维数组来存储图的顶点数据信息。这就是图的邻接矩阵表示法。
无向图的邻接矩阵
在无向图的邻接矩阵中,第行(或者第列)上的非零元素的个数就是顶点的度,也就表示着这两个顶点之间存在一条边。
举一个例子:
从上图中我们可以发现,顶点A的有三条边,分别连接三个顶点:B、C、D。
那么在邻接矩阵的示意图中,对应的元素就是1,即表示这两个顶点之间有边,而如果没有边的话,比如顶点A和顶点E和F就没有边,此时对应的元素就为0。如下所示:
同时,因为无向图的边是没有方向的,这时A与B有边就意味着B与A有边,同样的道理,顶点C和D也一样。如下所示:
有向图的邻接矩阵
在有向图的邻接矩阵中,第行第列上的元素可表示顶点到是否存在边。如果存在一条边,则该元素为1,否则为0。
比如上图中,顶点A有两条边,分别指向顶点B和顶点D,因此在第1行的第2列和第4列上,元素就为1,其他元素则为0。
但需要注意,和无向图不同。在有向图中,顶点之间的边是有方向的。如上图所示,顶点A存在一条边,使得A指向B,但是并不存在一条边,使得顶点B指向A。
邻接矩阵的实现
这里用一个一维数组来存储图的顶点数据信息,用一个二维数组来表示顶点之间的邻接关系。图的邻接矩阵表示是唯一的,含有个顶点的图,其邻接矩阵的空间代价是,与图的顶点数有关,与边数无关。
求顶点的度
在无向图中,第i个顶点的度就等于第i行(或第i列)的非零元素的个数。
和无向图不同,在有向图中,顶点的度分为出度和入度:
- 第i个顶点的出度就等于第i行的非零元素的个数。
- 第i个顶点的入度就等于第i列的非零元素的个数。
- 因此第i个顶点的度就等于第i行、第i列的非零元素个数之和。
带权图的邻接矩阵
在之前我们讨论的都是没有权值的图。
而如果是带权图,其邻接矩阵有什么特点?
如上所示,在带权图中,我们需要在对应的位置上用这两个顶点之前的权值来表示。而用无穷来表示这两个顶点之间不存在边。因此带权图的代码实现,关键在于这个无穷标记该怎么表示。比如我们可以使用宏定义常量的方式来使用int类型的上限进而表示所谓无穷这个概念。当然这只是一个举例,具体还是得看自己怎么实现。
小结
- 空间复杂度为,也就是取决于顶点数的多少(和实际的边数无关)
- 适合应用于存储稠密图
- 由于无向图的邻接矩阵是对称矩阵,因此可以将元素存储在上三角区或下三角区。
- 设图的邻接矩阵为 (矩阵的元素为或),则的元素表示从顶点到顶点的长度为的路径的数目。
3、写在最后
好了,文章的内容就到这里,感谢观看。