1.10 数据结构之图

学习参考:《labuladong 的算法笔记》

https://labuladong.online/algo/data-structure-basic/graph-basic/#邻接表和邻接矩阵实现图结构

一幅图结构由若干 节点 (Vertex) 和 边 (Edge) 构成,其中:

每个节点有一个唯一 ID。

边可以是有向的(有向图,Directional Graph),也可以是无向的(无向图,Undirected Graph)。

边上可以有权重(加权图,Weighted Graph),也可以没有权重(无权图,Unweighted Graph)。

图论中的基本术语

连通性

无向图的连通性

连通图 (Connected Graph): 如果无向图中任意两个节点之间都存在一条路径,我们称这个图是连通的。

连通分量 (Connected Component):对于非连通的无向图,其中的多个连通子图被称为连通分量,一个图可以有多个连通分量。

比如下面这幅图有两个连通分量:节点 1~5 形成一个连通分量,节点 6,7 形成另一个连通分量。

有向图的连通性

有向图的连通性概念稍微复杂一些,因为考虑到边的方向,所以有向图的连通性分为强连通和弱连通。

**强连通图 (Strongly Connected Graph):**如果有向图中任意两个节点之间都存在一条有向路径,我们称这个图是强连通的。

比如下面这幅图是一个强连通图,从任意节点出发都能到达其他所有节点。

**弱连通图 (Weakly Connected Graph):**如果将有向图中的所有有向边都变成无向边后,该图变成连通的,那么原来的有向图就是弱连通的。

比如下面这幅图不是强连通的(无法从节点 4 到达节点 1),但它是弱连通的,因为忽略边的方向后,所有节点之间都是连通的。

强连通分量 (Strongly Connected Component, SCC):有向图中的若干个最大的强连通子图称为强连通分量。

弱连通分量 (Weakly Connected Component, WCC):将有向图的所有有向边变为无向边后,形成的连通分量称为原有向图的弱连通分量。

图结构的通用代码实现

图结构就是 多叉树结构 的延伸。图结构逻辑上由若干节点(Vertex)和边(Edge)构成,我们一般用邻接表、邻接矩阵等方式来存储图。在树结构中,只允许父节点指向子节点,不存在子节点指向父节点的情况,子节点之间也不会互相链接;而图中没有那么多限制,节点之间可以相互指向,形成复杂的网络结构。

邻接表和邻接矩阵实现图结构

邻接表很直观,我把每个节点 x 的邻居都存到一个列表里,然后把 x 和这个列表映射起来,这样就可以通过一个节点 x 找到它的所有相邻节点。

邻接矩阵则是一个二维布尔数组,我们权且称为 matrix,如果节点 x 和 y 是相连的,那么就把 matrix[x][y] 设为 true(上图中绿色的方格代表 true)。如果想找节点 x 的邻居,去扫一圈 matrix[x][...] 就行了。

相关推荐
星轨初途2 小时前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法
Chance_to_win4 小时前
数据结构之排序
数据结构
小年糕是糕手4 小时前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
kupeThinkPoem4 小时前
跳表有哪些算法?
数据结构·算法
前端小L5 小时前
图论专题(二十一):并查集的“工程应用”——拔线重连,修复「连通网络」
数据结构·算法·深度优先·图论·宽度优先
前端小L5 小时前
图论专题(二十三):并查集的“数据清洗”——解决复杂的「账户合并」
数据结构·算法·安全·深度优先·图论
啊董dong6 小时前
课后作业-2025年11月23号作业
数据结构·c++·算法·深度优先·noi
dlz08366 小时前
从架构到数据结构,到同步逻辑,到 show run 流程优化
数据结构
jllws16 小时前
数据结构_字符和汉字的编码与查找
数据结构