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 是相连的,那么就把 matrixxy 设为 true(上图中绿色的方格代表 true)。如果想找节点 x 的邻居,去扫一圈 matrixx... 就行了。

相关推荐
mmmmath_314 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
Shaoshing20 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_320 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
suhan21 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan21 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan21 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
suhan21 小时前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
suhan21 小时前
【数据结构】三、栈和队列:2.顺序栈&共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)
数据结构·后端·算法
SelectDB1 天前
部署形态与存算分离速查:形态对照、配置项清单与关键命令片段
大数据·数据结构·数据库
0+1111 天前
算法 --哈希表
数据结构·算法·散列表