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... 就行了。

相关推荐
LuminousCPP10 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
白狐_79812 小时前
408数据结构第5章:树与二叉树②——遍历、线索树、森林与哈夫曼
数据结构·算法·深度优先
Jasmine_llq13 小时前
《P15800 [GESP202603 六级] 选数》
数据结构·long long·逆序线性 dp·从后往前推导·转移严格遵循题意·防止总和溢出·复杂度on
疯狂打码的少年14 小时前
【数据结构】串(字符串):基本概念与存储
数据结构·笔记
纵有疾風起15 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
wuyk55515 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
LuminousCPP16 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil20816 小时前
leetcode 三数之和
数据结构·算法·leetcode
noipp17 小时前
推荐题目:洛谷 P16689 出征
java·开发语言·数据结构·c++·算法·洛谷·luogu
青山木17 小时前
Hot 100 --- 最小栈
java·数据结构·算法·leetcode