文章目录
第六章 图
图的基本概念
图的存储
图的存储——邻接矩阵
- 无向图
第i个结点的度 = 第i行(第i列)的非零元素个数
- 有向图
第i个结点的出度 = 第i行非零元素个数
第i个结点的入度 = 第i列非零元素个数
第i个结点的度 = 第i行第i列的非零元素个数之和
数组实现的顺序存储,空间复杂度高,不适合存储稀疏图,空间复杂度跟顶点有关,跟边的数量没有关系
只要确定顶点编号,图的邻接矩阵表示方式唯一
图的存储——邻接表
图的邻接表表示方式不唯一
图的存储——十字链表
图的存储——邻接多重表
图的重要操作
图的广度优先遍历
- 遍历序列的可变性
因为邻接矩阵是唯一的,在进行广度优先遍历的时候,就是唯一的,但是邻接表是不唯一的,在进行广度优先遍历的时候,就不会是唯一的,因为邻接的所指向的指针的没有固定要求的顺序,可以进行改变,所以是不唯一的
- 时间复杂度
访问结点的时间 + 访问各条边的时间
邻接矩阵和邻接表的序列不同所以访问的时候,他所需要是的时间就不相同,邻接矩阵在访问结点的时候需要遍历所有的结点,遍历所有邻接的边的时候也是需要遍历所有的结点,邻接表遍历结点的时候是遍历所有结点,但是在遍历邻接的边的时候就是看当前这个结点有多少指针,遍历指针就行
- 广度优先生成树
在进行图的遍历的时候,将第一次访问的边进行标记,就可以生成树,邻接表的序列不是唯一的,所以在进行优先生成树的也是不唯一的
- 广度优先生成森林
非连通图进行广度优先生成树的时候就可以生成森林
图的深度优先遍历
- 遍历序列的可变性
因为邻接矩阵是唯一的,在进行遍历序列的时候也就是唯一的,但是邻接表不是唯一的,他又不同的序列,所以在进行遍历序列的时候是不唯一的,这里跟广度优先遍历是一样的
- 时间复杂度
时间复杂度 =访问各结点所需的时间 + 探索各条边所需的时间
- 深度优先生成树
在进行访问的时候,将第一次被访问的边进行标记,就可以获得深度优先生成树
同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一,深度优先生成树也唯一,同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一,深度优先生成树也不唯一
- 深度优先生成森林
非连通图进行深度优先生成树的时候就可以生成森林
- 图的遍历与图的连通性
对于无向图进行BFS/DFS遍历,调用BFS/DFS函数的次数=连通分量数,对于连通图,只需要调用一次BFS/DFS
对于有向图进行BFS/DFS遍历,分析它的指向,才能够确定调用函数的次数,但是对于强连通图来说,只需要调用一次
图的基本应用
最小生成树
-
最小生成树可能有多个,但边的权值之和总是唯一且最小的
-
最小生成树的边数 = 顶点数 - 1,砍掉一条则不连通,增加一条边则会出现回路
-
如果一个连通图本身就是一棵树,则其最小生成树就是他本身
-
只有连通图才有生成树,非连通图只有生成森林
- Prim算法(普利姆)
- Kruskal算法(克鲁斯卡尔)
- 两个算法的区别
最短路径问题——BFS算法
BFS算法求单源最短路径只适用于无权图,或所有边的权值都相同的图
最短路径问题——Dijkstra算法
迪杰斯特拉:1972年图灵奖得主
带权路径长度——当图时带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度。
结论:Dijkstra算法不适用于有负权值的带权图
最短路径问题——Floyd算法
Floyd算法找顶点之间的最短路径,使用动态规划思想,将问题的求解分为多个阶段
对于n个顶点的图G,求任意一对顶点Vi~Vj之间的最短路径可分为如下几个阶段:
- 初始:不允许在其他顶点中转,最短的路径?
- 0,若允许在V0中转,最短路径?
- 1,若允许在V0,V1中转,最短路径?
- 2,若允许在V0,V1,V2中转,最短路径?
… - n-1,若允许在V0,V1,V2…Vn-1中转,最短路径?
可以解决带负权值带权图,但是他不能解决带有负权回路的图,也就是有负权值的边组成的回路,这种图时没有最短路径的
有向无环图——描述表达式
有向无环图:若一个有向图中不存在环,则称为有向无环图,简称DAG图
有向无环图——拓扑排序:找到做事情得先后顺序
拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列的条件时,称为该图的一个拓扑排序,
-
每个顶点出现且仅出现一次
-
若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径
或者定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得若存在从顶点A到顶点B得路径,则在排序中顶点B出现在顶点A得后面,每个AOV网都有一个或多个拓扑排序序列
关键路径
在AOE网中仅有一个入度为0得顶点,称为开始顶点(源点),他表示整个工程得开始,也仅有一个出度为0得顶点,称为结束顶点(汇点),他表示整个工程的结束,从源点到汇点的邮箱路径可能由很多条,所有路径中,具有最大路径长度的路径称为关键路径,而把关键路径上的活动称为关键活动,完成整个工程的最短时间就是关键路径的长度,若关键活动不能按时完成,则整个工程的完成时间就会延长
事件Vk的最迟发生时间——它是指在不推迟整个工程完成的前提下,该事件最迟必须发生的时间
活动ai的最迟开始时间——它是指该活动弧的终点所表示事件的最迟发生时间与该活动所需时间之差