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

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

在这里插入图片描述

三、连通图与强连通图

在这里插入图片描述

四、子图

在这里插入图片描述

五、连通分量

在这里插入图片描述

六、生成树

n n n个点, n − 1 n-1 n1条边,边再多就形成回路
在这里插入图片描述

七、几种特殊形态的图

无向完全图、有向完全图
在这里插入图片描述
树、森林、有向树
在这里插入图片描述

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

在这里插入图片描述
对于不带权无向图,求顶点的度时,只需要对某行或某列求和即可
对于不带权有向图,对行求和表示顶点的出度,对列求和表示顶点的入度

邻接矩阵的性质

在这里插入图片描述

2. 邻接表法

在这里插入图片描述
在这里插入图片描述
邻接表和邻接矩阵的对比:
在这里插入图片描述

3. 十字链表法

只能存储有向图,一个结构体表示一条边
在这里插入图片描述
在这里插入图片描述

九、图的遍历
1. 广度优先遍历(BFS)
  • 访问初始结点
  • 访问初始结点所有的相邻结点
  • 根据这些相邻的结点,再次挨个访问他们相邻的结点
    在这里插入图片描述

为了能遍历到非连通图的所有结点,我们检查 v i s i t e d visited visited数组,找到没有遍历到的结点,从该结点开始调用 B F S BFS BFS
在这里插入图片描述

广度优先生成树

根据遍历的顺序,构造生成树
在这里插入图片描述
邻接表中结点顺序不同,构造的生成树也不同。用邻接矩阵构造的生成树必唯一。
在这里插入图片描述

2. 深度优先遍历(DFS)

类似于树的先序遍历。

图的DFS: 遍历一个点,然后遍历与该点相邻的第一个点,接着再遍历与正在遍历结点第一个相邻的且未被访问的结点,如此下去,直到某个遍历的结点不存在没遍历的结点,然后返回上层。上层接着遍历相邻的第二个未被访问的结点
在这里插入图片描述
同样地,为遍历到非连通图的所有结点,我们检查 v i s i t e d visited visited数组,找到没有遍历到的结点,从该结点开始调用 D F S DFS DFS
在这里插入图片描述
复杂度分析
在这里插入图片描述
在这里插入图片描述

深度优先生成树

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

图的遍历与图的连通性

无向图
在这里插入图片描述
有向图
在这里插入图片描述

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

连通图的生成树: 包含图中全部顶点的一个极小连通子图,若图中含有 n n n个顶点和 n − 1 n-1 n1条边。对于生成树而言,减少一条边,则变得不连通。加上一条边,则形成回路。

在这里插入图片描述

2. Prim算法

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

在这里插入图片描述

3. Kruskal算法

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

在这里插入图片描述

算法对比

在这里插入图片描述

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

初始化工作:将源点放入 S S S集合,修改布尔型数组 S S S。对于与源点相邻的结点,更新 d i s t dist dist数组。对于不相邻的结点, d i s t dist dist值为无穷

每次在 S S S集合中加入 1 1 1个点,每次找到不在 S S S集合中且距离源点最近的点加入到 S S S。加入后更新不在 S S S集合中的点与源点的距离,即 d i s t dist dist数组与 p r e v prev prev数组。

参考代码

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

2. Floyd算法

在这里插入图片描述
注: Floyd不能解决带负权值的图

在这里插入图片描述

十二、有向无环图

在这里插入图片描述

答案选A:
在这里插入图片描述

构造有向无环图步骤

在这里插入图片描述
三个加号的操作数相同,合并3个加号:在这里插入图片描述
右侧两个乘号的操作数相同,合并2个乘号:
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/qq_42500831/article/details/107859672