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

相关推荐
丑八怪大丑24 分钟前
Java数据结构与集合源码
数据结构
一个爱编程的人9 小时前
一个数是不是素数
数据结构·算法
忡黑梨9 小时前
eNSP_从直连到BGP全网互通
c语言·网络·数据结构·python·算法·网络安全
地球资源数据云10 小时前
1900-2023年中国物种分布点位矢量数据集
大数据·数据结构·数据库·数据仓库·人工智能
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题】【Java基础篇】第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作
java·开发语言·数据结构·后端·面试·哈希算法·hash-index
牢姐与蒯10 小时前
cpp数据结构之map
数据结构
故事和你9110 小时前
洛谷-算法2-3-分治与倍增5
开发语言·数据结构·c++·算法·动态规划·图论
北顾笙98011 小时前
day37-数据结构力扣
数据结构·算法·leetcode
liuyao_xianhui12 小时前
进程概念与进程状态_Linux
linux·运维·服务器·数据结构·c++·哈希算法·宽度优先
如君愿12 小时前
考研复习 Day 26 | 习题--计算机网络第三章(数据链路层 下)、数据结构 多维数组与广义表
数据结构·计算机网络·考研·记录考研