五、 图
1. 图的基本概念
1. 图的定义
顶点集V和边集E
- 有向图
- 无向图
- 简单图
- 多重图
- 完全图(也称简单完全图)
在无向图中,若任意两个顶点之间都存在边,则称该图为无向完全图。
在有向图中,若任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。 - 子图
- 连通、连通图和连通分量
在无向图中,若从顶点v到顶点w有路径存在,则称v和w是连通的。若图G中任意两个顶点都是连通的,则称图G为连通图,否则称为非连通图。无向图中的极大连通子图称为连通分量。 - 强连通图、强连通分量
- 生成树、生成森林
- 顶点的读、入度和出度
- 边的权和网
- 稠密图、稀疏图
- 路径、路径长度和回路
- 简单路径、简单回路
- 距离
- 有向树
2. 图的存储及基本操作
1. 邻接矩阵法
对于任一有向图,如果他的邻接矩阵中对角线以下(或以上)的元素均为零,则存在拓扑序列(但可能不唯一) 。
2. 邻接表法
3. ★十字链表法
4. ★邻接多重表
5. 图的基本操作
3. 图的遍历
1. 广度优先搜索
- BFS算法的性能分析
无论是邻接表还是邻接矩阵的存储方式,BFS算法都需要借助一个辅助队列Q,n个顶点均需入队一次,在最坏情况下,空间复杂度为O(|V|)。
采用邻接表存储方式时,每个顶点均需搜索一次(或入队一次),故时间复杂度为O(|V|),在搜索任一顶点的邻接点时,每条边至少访问一次,故时间复杂度为O(|E|),算法总的世界复杂度为O(|V|+|E|) 。采用邻接矩阵存储方式时,查找每个结点的邻接结点所需的时间为O(|V|),故算法总的时间复杂度为O(|V|2)。 - BFS算法求解单源最短路径问题
- 广度优先生成树
2. 深度优先搜索
- DFS算法的性能分析
- 深度优先的生成树和生成森林
- 图的遍历与图的连通性
4. 图的应用
1. 最小生成树
- Prim算法
- Kruskal算法
2. 最短路径
求解最短路径的算法通常都依赖于一种性质,即两点之间的最短路径也包含了路径上其他顶点间的最短路径。带权有向图G的最短路径问题一般可分为两类:一是单源最短路径,即求图中某一顶点到其他各顶点的最短路径,可通过经典的Dijkstra算法求解;而是求每对顶点间的最短路径,可通过Floyd-Warshall算法来求解。
-
Dijkstra算法求单源最短路径问题
-
Floyd算法求各顶点之间最短路径问题
3. 拓扑排序
4. 关键路径
- 事件Vk的最早发生时间Ve(k)
- 事件Vk的最迟发生时间Vl(k)
- 活动a¬i的最早开始时间e(i)
- 活动ai的最迟开始时间l(i)
- 一个活动ai的最迟开始时间l(i)和其最早开始时间e(i)的差额d(i)=l(i)-e(i)