第六章 图--以下代码由C语言实现
王道学习
6.1 知识框架

6.2 图的基本概念
6.2.1 图的定义

注意:线性表可以是空表,树可以是空树,但图不可以是空图。就是说,图中不能一个顶点也没有,图的顶点集V一定非空,但边集E可以为空,此时图中只有顶点而没有边。
1、无向图、有向图

2、简单图、多重图

3、顶点的度--入度、出度

4、顶点--顶点的关系描述

5、连通图、强连通图

6、子图


7、连通分量

8、强连通分量

9、生成树

10、生成森林

11、边的权、带权图/网

12、几种特殊形态的图




6.2.2 本节试题精选













6.3 图的存储及基本操作
6.3.1 邻接矩阵法
数组实现的顺序存储,空间复杂度高,不适合存储稀疏图









注意:
(1)在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点信息等均可省略)。
(2)当邻接矩阵中的元素仅表示相应的边是否存在时,EdgeType可定义为值为0和1的枚举类型。
(3)无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储。
(4)邻接矩阵表示法的空间复杂度为O(n的平方),其中n为图的顶点树|V|
6.3.2 邻接表法






图的邻接表存储方法具有一下特点:
(1)若G为无向图,则需要的存储空间为O(|V|+2|E|);若G为有向图,则所需的存储空间为O(|V|+|E|)。前者的倍数2是由于无向图中,每条边在邻接表中出现了两次。
(2)对于稀疏图,采用邻接表表示将极大地节省存储空间。
(3)在邻接表中,给定一顶点,能很容易地找出它的所有邻边,因为只需要读取它的邻接表。在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为O(n)。但是,若要确定给定的两个顶点建是否存在边,则在邻接矩阵中可以立刻查到,而在邻接表中则需要在相应结点对应的边表中查找另一结点,效率较低。
(4)在有向图的邻接表表示中,求一个给定顶点的出度只需计算其邻接表中的结点个数;但求其顶点的入度则需要遍历全部的邻接表。因此,也有人采用逆邻接表的存储方式来加速求解给定顶点的入度。当然,这实际上与邻接表存储方式是类似的。
(5)图的邻接表表示并不唯一,因为在每个顶点对应的单链表中,各边结点的链接次序可以是任意的,它取决于建立邻接表的算法及边输入的次序。
6.3.3 十字链表存储有向图


6.3.4 邻接多重表存储无向图





6.3.5 图的基本操作
















6.3.6 本节试题精选











6.4 图的遍历
6.4.1 广度优先遍历--BFS













6.4.2 深度优先遍历--DFS










6.4.3 本节试题精选







6.5 图的应用
6.5.1 最小生成树
一个连通图的生成树包含图的所有顶点,并且只含尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路。
对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设A为G的所有生成树的集合,若T为A中边的权值之和最小的那颗生成树,则T称为G的最小生成树(Minimum-Spanning-Tree,MST)。
不难看出,最小生成树具有如下性质:
1)最小生成树不是唯一的,即最小生成树的树形不唯一,A中可能有多个最小生成树。当图G中的各边权值互不相等时,G的最小生成树是唯一的;若无向连通图G的边数比顶点数少1,即G本身是一棵树时,则G的最小生成树就是它本身。
2)最小生成树的边的权值之和总是唯一的,虽然最小生成树不唯一,但其对应的边的权值之和总是唯一的,而且是最小的。
3)最小生成树的边数为顶点数减1。
Prim算法和Kruskal算法,都基于贪心算法的策略。
1、Prim算法


2、Kruskal算法










Prim算法实现思想











Kruskal算法实现思想






使用并查集判断两个顶点是否属于同一集合
6.5.2 最短路径

BFS算法








Dijkstra算法







Floyd算法












6.5.3 有向无环图--描述表达式














6.5.4 拓扑排序































6.5.5 关键路径

















6.5.6 本节试题精选






的问题的。






浙公网安备 33010602011771号