文章目录

一、顶点的度
  • 对于无向图,顶点的度 = 依附于该顶点的边的数量
  • 对于有向图,入度 = 出度 = 边的数量
二、顶点—顶点关系的描述

【复习笔记】数据结构之图_结点

三、连通图与强连通图

【复习笔记】数据结构之图_生成树_02

四、子图

【复习笔记】数据结构之图_结点_03

五、连通分量

【复习笔记】数据结构之图_邻接矩阵_04

六、生成树

【复习笔记】数据结构之图_邻接矩阵_05个点,【复习笔记】数据结构之图_邻接矩阵_06条边,边再多就形成回路

【复习笔记】数据结构之图_结点_07

七、几种特殊形态的图

无向完全图、有向完全图

【复习笔记】数据结构之图_邻接矩阵_08


树、森林、有向树

【复习笔记】数据结构之图_结点_09

八、图的存储
1.邻接矩阵法

【复习笔记】数据结构之图_结点_10


对于不带权无向图,求顶点的度时,只需要对某行或某列求和即可

对于不带权有向图,对行求和表示顶点的出度,对列求和表示顶点的入度

邻接矩阵的性质
2. 邻接表法

【复习笔记】数据结构之图_邻接矩阵_11

【复习笔记】数据结构之图_生成树_12

【复习笔记】数据结构之图_邻接矩阵_13

邻接表和邻接矩阵的对比:

【复习笔记】数据结构之图_结点_14

3. 十字链表法

只能存储有向图,一个结构体表示一条边

【复习笔记】数据结构之图_结点_15


【复习笔记】数据结构之图_生成树_16

九、图的遍历
1. 广度优先遍历(BFS)
  • 访问初始结点
  • 访问初始结点所有的相邻结点

  • 根据这些相邻的结点,再次挨个访问他们相邻的结点
  • 【复习笔记】数据结构之图_生成树_17

为了能遍历到非连通图的所有结点,我们检查【复习笔记】数据结构之图_结点_18数组,找到没有遍历到的结点,从该结点开始调用【复习笔记】数据结构之图_结点_19

【复习笔记】数据结构之图_邻接矩阵_20

广度优先生成树

根据遍历的顺序,构造生成树

【复习笔记】数据结构之图_生成树_21


邻接表中结点顺序不同,构造的生成树也不同。用邻接矩阵构造的生成树必唯一。

【复习笔记】数据结构之图_邻接矩阵_22

2. 深度优先遍历(DFS)

类似于树的先序遍历。

图的DFS: 遍历一个点,然后遍历与该点相邻的第一个点,接着再遍历与正在遍历结点第一个相邻的且未被访问的结点,如此下去,直到某个遍历的结点不存在没遍历的结点,然后返回上层。上层接着遍历相邻的第二个未被访问的结点

【复习笔记】数据结构之图_生成树_23


同样地,为遍历到非连通图的所有结点,我们检查【复习笔记】数据结构之图_结点_18数组,找到没有遍历到的结点,从该结点开始调用【复习笔记】数据结构之图_邻接矩阵_25

【复习笔记】数据结构之图_邻接矩阵_26


复杂度分析

【复习笔记】数据结构之图_生成树_27


【复习笔记】数据结构之图_邻接矩阵_28

深度优先生成树

根据深度优先遍历的顺序,构造生成树

图的遍历与图的连通性

无向图

【复习笔记】数据结构之图_邻接矩阵_29


有向图

【复习笔记】数据结构之图_邻接矩阵_30

十、最小生成树
1. 相关概念

连通图的生成树: 包含图中全部顶点的一个极小连通子图,若图中含有【复习笔记】数据结构之图_邻接矩阵_05个顶点和【复习笔记】数据结构之图_邻接矩阵_06条边。对于生成树而言,减少一条边,则变得不连通。加上一条边,则形成回路。

【复习笔记】数据结构之图_结点_33

2. Prim算法

从某个顶点开始构建生成树,每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。同一个图构建的 最小生成树不唯一

【复习笔记】数据结构之图_生成树_34

3. Kruskal算法

每次选择一条权值最小的边,使这条边的两头连通(原本已经连通就不选),直到所有结点都连通。

【复习笔记】数据结构之图_邻接矩阵_35

算法对比

【复习笔记】数据结构之图_生成树_36

十一、最短路径问题
1.Dijkstra算法

初始化工作:将源点放入【复习笔记】数据结构之图_生成树_37集合,修改布尔型数组【复习笔记】数据结构之图_生成树_37。对于与源点相邻的结点,更新【复习笔记】数据结构之图_邻接矩阵_39数组。对于不相邻的结点,【复习笔记】数据结构之图_邻接矩阵_39值为无穷

每次在【复习笔记】数据结构之图_生成树_37集合中加入【复习笔记】数据结构之图_结点_42个点,每次找到不在【复习笔记】数据结构之图_生成树_37集合中且距离源点最近的点加入到【复习笔记】数据结构之图_生成树_37。加入后更新不在【复习笔记】数据结构之图_生成树_37集合中的点与源点的距离,即【复习笔记】数据结构之图_邻接矩阵_39数组与【复习笔记】数据结构之图_生成树_47数组。

​参考代码​

注: Dijkstra不能解决带负权值的图

2. Floyd算法

【复习笔记】数据结构之图_结点_48


注: Floyd不能解决带负权值的图

【复习笔记】数据结构之图_邻接矩阵_49

十二、有向无环图

【复习笔记】数据结构之图_邻接矩阵_50

答案选A:

【复习笔记】数据结构之图_邻接矩阵_51

构造有向无环图步骤

【复习笔记】数据结构之图_生成树_52


三个加号的操作数相同,合并3个加号:

【复习笔记】数据结构之图_结点_53


右侧两个乘号的操作数相同,合并2个乘号:

【复习笔记】数据结构之图_邻接矩阵_54

注: 不同层的运算符不可能合并