文章目录
这是动脑学院的"java版数据结构和算法"的学习笔记
1 图的概念
图(Graph)是由定点的有穷非空集合和顶点之间边的集合组成,通常表示为 G(V,E)。G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
2 图的特性
- 图中的数据元素,称为
顶点(Vertext)
- 图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。
3 无向图
- 无向边 (Edge): 顶点vi到vj之间的边没有方向,用无序偶对(vi,vj)来表示
- 无向图(Undirected graphs):图中任意两个顶 点的边都是无向边
- 无向完全图: 无向图中,如果任意两个顶点之间都存在边 (如下图)
4 有向图
- 有向边:从顶点vi到vj的边有方向,则叫有向边,也叫弧(Arc)。 用有序偶<vi,vj>来表示,vi称为
弧尾(Tail)
, vj称为弧头(Head)
。 - 有向图: 图中任意两个顶点的边都是有向边。
- 有向完全图: 如果任意两个顶点之间都存在方向互为相互的两条边(如下图)
5 图的权(Weight)
- 权:这种与图的边或弧相关的数叫做权
6 连通图
- 在无向图G中,如果顶点vi到vj有路径,则称vi和vj是连通的
- 对于图中任意两个顶点vi,vj,都是连通的,则G为
连通图
- 图1不是连通图, 图2是连通图
7 图顶点的度
- 无向图顶点的边数叫度
- 有向图顶点的边数叫出度和入度
8 图的存储结构
8.1 图的邻接矩阵
- 图的
邻接矩阵(Adjacency Matrix)
存储方式是用两个数组
来表示图。 - 一个一维数组存储图中
顶点信息
- 一个二维数组(称为邻接矩阵)存储图中的
边或弧的信息
8.2 无向图的邻接矩阵
8.3 有向图的邻接矩阵
8.4 带权邻接矩阵
8.5 浪费的邻接矩阵
8.6 邻接表
在树中,我们讲到了一种孩子表示法, 将结点存入数组,并对结点的孩子进行链式存储,不管有多少孩子,也不会存在空间浪费问题,这个思路同样适用于图的存储。我们把这种数组与链表相结合的存储方法称为邻接表
。
8.7 无向图的邻接表
8.8 有向图的邻接表
- 正邻接表
- 逆邻接表
8.9 带权值邻接表
9 图的遍历
- 从图中某一顶点出发遍访图中其余顶点,且使每一个顶点仅被访问一次
9.1 深度优先遍历
- 深度优先遍历(Depth_First_Search), 简称
DFS
- 从图中某个顶点v除法,访问此顶点,然后从v的未被访问的邻接点出发优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。
对上面的图,我们进行拆解成树
深度遍历算法思想:
- 为了防止重复遍历,需对已经遍历过的点做一个标记
- 要深度遍历某个树,先遍历根节点,再深度遍历第一个子树,然后继续深度遍历其所有的子树
按深度进行遍历过程: