首页计算机计算机基础数据结构-C#语言描述 06 第06章 图.pptx

06 第06章 图.pptx

页数:38页文件大小:559.2 KB来源: 数据结构-C#语言描述ppt课件

本课件讲解图形结构这一多对多的非线性结构:先给出顶点集、边集及无向图有向图、度与邻接、路径与连通、权与网等术语,再讲邻接矩阵与邻接表两类存储方式,图解深度优先与广度优先遍历及生成树,最后展开普里姆、克鲁斯卡尔两种最小生成树算法与迪杰斯特拉、弗洛伊德最短路径算法。

第六章图章节封面,引出图的基本概念、存储结构、遍历与最短路径四条主线
图的引入页,对比线性表一对一、树一对多并指出图中元素是多对多关系
图的定义页,给出顶点集与边集的表示法并列举四个顶点五条边的例子
查看本课件的文字版(共 38 页,供检索与复制)

第1页:第六章图封面

本页为第六章图封面。本章讲解图的基本概念与术语、邻接矩阵与邻接表存储结构、图的遍历、生成树与最小生成树,以及最短路径算法。

第2页:图结构的引入

线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,本章所讲述的图形结构中的元素则是“多对多”的关系。

图(Graph)是一种复杂的非线性数据结构,在图形结构中,每个元素可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。

第3页:图的定义:顶点集与边集

一个图(Graph)是由顶点(Vertex)集 V 和边(Edge,又称为弧)集 E 组成的。图中顶点用 Vi 来表示,在括号中使用逗号分隔的两个顶点来表示一条边,如 (V1,V2)。

示例:顶点集 V(G) = {V1,V2,V3,V4},边集 E(G) = { (V1,V2),(V1,V3),(V1,V4),(V2,V4) }。

第4页:无向图与有向图

无向图
若图中所有边的两个顶点没有次序关系和方向性,即(V1,V2)和(V2,V1)代表的是同一条边,则称为无向图
有向图
若图中两个顶点存在次序关系和方向性,即 <V1,V2> 和 <V2,V1> 代表的是两条不同的边,则称为有向图

第5页:完全图、稠密图与稀疏图

完全图
在一个无向图中,如果任意两顶点都有一条边直接连接,则称该图为完全无向图。在一个有向图中,如果任意两顶点都存在着方向相反的两条边,则称此图为完全有向图
稠密图与稀疏图
当一个图接近完全图时,则称它为稠密图(Dense Graph);当一个图含有较少的边数时,则称为稀疏图(Sparse Graph)

第6页:顶点的度与邻接

顶点的度(Degree)
顶点 Vi 的度是指在图中与 Vi 相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和
邻接(Adjacent)
若无向图中的两个顶点 V1 和 V2 存在一条边 (V1,V2),则称顶点 V1 和 V2 相邻。在有向图中存在一条边 <V3,V2>,则称顶点 V3 与顶点 V2 邻接,且是 V3 邻接到 V2 或 V2 邻接自 V3

第7页:子图

设有两个图 G = (V,E) 和 G' = (V',E'),若 V' 是 V 的子集,且 E' 是 E 的子集,则称 G' 是 G 的子图。

图中 (b)、(c) 都是由 (a) 中去掉部分顶点与边后得到的子图。

第8页:路径

路径(Path):在无向图中,若从顶点 Vi 出发有一组边可到达顶点 Vj,则称顶点 Vi 到顶点 Vj 的顶点序列为从顶点 Vi 到顶点 Vj 的路径。

图中给出了从起点沿若干条边到达终点的两种不同走法,说明两点之间的路径可能有多条。

第9页:连通、连通图与连通分量

连通(Connected)
若从 Vi 到 Vj 有路径可通,则称顶点 Vi 和顶点 Vj 是连通的
连通图(Connected Graph)
在无向图中任意两个结点都有路径相通的,称为连通图。只要有两个结点无路径相通,则称为非连通图。图中的极大连通子图称为连通分量

第10页:强连通图与强连通分量

强连通图(Strongly Connected Graph):在有向图中,若任意一对不同的顶点 Vi 和 Vj 都存在从 Vi 到 Vj 及 Vj 到 Vi 的路径,则称为强连通图。

有向图中极大的强连通子图称为它的强连通分量。

第11页:权与网

权(Weight):图的边有时会包含具有某种特定含义的数据信息,这些附带的数据信息称为权。权可以表示实际问题中从一个顶点到另一个顶点的距离、花费代价、所需时间等。

带权的图也称作网络或网。图中给出了北京、上海、南宁、广州、武汉等城市之间带有距离数值的带权图。

第12页:邻接矩阵:无向图

邻接矩阵表示法用一个二维数组存放图中各顶点之间的邻接关系:矩阵第 i 行第 j 列为 1 表示顶点 i 与顶点 j 之间有边,为 0 表示无边。

无向图的邻接矩阵一定关于主对角线对称,且主对角线元素为 0。

第13页:邻接矩阵:有向图

有向图的邻接矩阵一般不再对称:第 i 行第 j 列为 1 表示存在由顶点 i 指向顶点 j 的弧。

因此同一行之和为该顶点的出度,同一列之和为该顶点的入度。

第14页:邻接表:无向图

邻接表由表头结点与表结点两部分组成:

  • 表头结点:data 存放顶点数据,firstEdge 指向第一个邻接点
  • 表结点:adjvex 存放邻接点在数组中的下标,next 指向下一个邻接点

图中给出了无向图 ABCD 及其对应的邻接表,每个顶点的所有邻接点串成一条单链表。

第15页:有向图的邻接表与逆邻接表

图中 (a) 为有向图,(b) 为按出边建立的邻接表,(c) 为按入边建立的逆邻接表。

邻接表便于找出某个顶点的所有后继,逆邻接表便于找出其所有前驱,二者结构相同、建表方向相反。

第16页:带权图的邻接表

带权图的邻接表在各个表结点中额外增加一个权值域,用于存放该边上的权。

图中给出了带权图 ABCD 及其邻接表,每条边除邻接点下标外还记录了对应的权值。

第17页:图的遍历

和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph)。

图的遍历方法有两种:一种是深度优先搜索遍历(Depth-First Search,简称 DFS);另一种是广度优先搜索遍历(Breadth_First Search,简称 BFS)。

第18页:深度优先搜索遍历

深度优先搜索遍历从图中某个顶点出发,访问该顶点后依次从它的未被访问的邻接点出发深度优先遍历,直到所有与起点有路径相通的顶点都被访问。

图中给出了 V1 到 V8 八个顶点按深度优先得到的访问序号。

第19页:广度优先搜索遍历

广度优先搜索遍历从某个顶点出发,依次访问它的所有未被访问的邻接点,再按同样次序访问这些邻接点的邻接点,表现为一层一层向外扩展。

图中给出了 V1 到 V8 八个顶点按广度优先得到的访问序号,与深度优先的结果明显不同。

第20页:非连通图的遍历

若无向图是非连通图,则只能访问到初始点所在连通分量中的所有顶点,其他连通分量中的顶点是不可能访问到的。

为此需要从其他每个连通分量中选择初始点,分别进行遍历,才能够访问到图中的所有顶点,否则不能访问到所有顶点。为此同样需要再选初始点,继续进行遍历,直到图中的所有顶点都被访问过为止。

第21页:生成树

对于无向图,含有连通图全部顶点的一个极小连通子图,称为生成树(Spanning Tree)。

其本质就是从连通图任一顶点出发进行遍历操作所经过的边,再加上所有顶点构成的子图。

第22页:深度优先生成树

采用深度优先搜索遍历方式获得的生成树称为深度优先生成树(DFS 生成树)。

图中左侧为带权连通图,右侧为按深度优先遍历经过的边所构成的树形子图。

第23页:广度优先生成树

采用广度优先搜索遍历获得的生成树称为广度优先生成树(BFS 树)。

图中右侧为按广度优先遍历经过的边所构成的树形子图,与深度优先生成树的形态不同。

第24页:最小生成树

如果连通图是一个网络(带权的图),称该网络中所有生成树中权值总和最小的生成树为最小生成树(Minimum Spanning Tree),简称 MST。

构造有 n 个顶点的无向连通带权图的最小生成树必须满足以下 3 个条件:

  1. 必须只使用该图中的边来构造最小生成树
  2. 必须使用且仅使用 n-1 条边来连接图中的 n 个顶点
  3. 构造的最小生成树中不存在回路

典型的构造最小生成树的方法有两种,一种称为普里姆(Prim)算法,另一种称为克鲁斯卡尔(Kruskal)算法。

第25页:普里姆算法

普里姆(Prim)算法是一种构造性算法。设图 G = (V,E) 是具有 n 个顶点的网,T = (U,E(T)) 为 G 的最小生成树,U 是 T 的顶点集合,E(T) 是 T 的边集合。

算法每次从连接 U 与 V-U 的边中选一条权值最小的边,把对应顶点并入 U,直到 U 包含全部顶点。

第26页:普里姆算法步骤一

本页演示普里姆算法的第一步:从集合 U 中的初始顶点 0 出发,在连接 U 与 V-U 的候选边中选取权值最小的一条,将其端点并入集合 U,并在最小生成树中画出这条边。

第27页:普里姆算法步骤二

本页演示普里姆算法的第二步:集合 U 已含两个顶点,重新考察所有一端在 U 中、另一端在 V-U 中的边,再取其中权值最小者,把新顶点并入 U。

第28页:普里姆算法步骤三

本页演示普里姆算法的第三步:集合 U 继续扩大,最小生成树中已确定的边随之增加,候选边集合同步更新,始终保留跨集合的最小权边。

第29页:普里姆算法步骤四

本页演示普里姆算法的第四步:继续选取跨集合的最小权边并入 U,最小生成树中已确定的边逐渐增多,剩余未确定顶点越来越少。

第30页:普里姆算法步骤五

本页演示普里姆算法的最后一步:当集合 U 包含全部顶点、最小生成树中选入的边达到顶点数减一条时,算法结束,得到权值总和最小的生成树。

第31页:克鲁斯卡尔算法

克鲁斯卡尔(Kruskal)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。假设 G = (V,E) 是一个具有 n 个顶点的带权连通无向图,T = (U,TE) 是 G 的最小生成树,则构造最小生成树的步骤为:

将图中所有边按权值递增顺序排序,依次选取权值较小的边,但要求后面选择的边不能与前面选择的边构成回路,否则就放弃该边,重复这个过程,直到 n 个顶点的图选出 n-1 条边即可。

第32页:克鲁斯卡尔算法过程

本页演示克鲁斯卡尔算法的执行过程:按权值由小到大依次考察各条边,把不会与已选边构成回路的边加入生成树,遇到会形成回路的边则直接放弃,直到选够顶点数减一条边为止。

第33页:单源点最短路径

单源点最短路径是指给定一个出发点(源点)和一个有向网,求出源点到其他各顶点之间的最短路径。

从源点 0 到终点 4 共有 4 条路径,下表列出各条路径及其长度:

源点 0 到终点 4 的候选路径对比表
候选序号路径路径长度
10 → 490
20 → 3 → 490
30 → 1 → 2 → 470
40 → 3 → 2 → 460

源点 0 到终点 4 的最短路径为第 4 条路径,长度为 60。

原课件该页另有一张含源点、中间顶点、终点、路径长度四列的结果表,因文本提取时数字粘连,此处仅还原正文中明确给出的四条路径对比,其余数据请以原课件图示为准。

第34页:迪杰斯特拉算法

迪杰斯特拉(Dijkstra)算法用于求单源点最短路径:把顶点分成已确定最短路径的集合 S 与尚未确定的集合 U,每轮从 U 中取出距离最小的顶点并入 S,并用它松弛其余顶点的距离值 dist,直到所有顶点都进入 S。

图中给出了有向网的邻接矩阵以及各轮 dist 结果集的变化。

第35页:弗洛伊德算法

对于给定的有向网而言,可以利用 Dijkstra 算法,把每个顶点作为源点重复执行 n 次,即可求出有 n 个顶点的有向网中每对顶点间的最短路径,它的时间复杂度为 O(n 的 3 次方)。

弗洛伊德(Floyed)提出了另一种算法用于计算有向网中所有顶点间的最短路径,这种算法称为弗洛伊德算法,它的时间复杂度依然为 O(n 的 3 次方),但形式上更为简单些。

第36页:弗洛伊德算法过程

本页演示弗洛伊德算法的迭代过程:以邻接矩阵为初始状态,依次把每个顶点作为允许中转的顶点,逐轮更新距离矩阵与路径矩阵,最终得到任意两顶点之间的最短路径长度。

第37页:图的小结

图是一种网状的多对多的非线性数据结构,图中的每个顶点可以有多个前驱和后继。图的存储包括结构有邻接矩阵、邻接表等。但在实际应用中,图也有可能以多种形式存在。

本章还介绍了求最小生成树的普里姆算法、克鲁斯卡尔算法,求最短路径的迪杰斯特拉算法、弗洛伊德算法,这些算法的掌握对于将来学习图论算法有着重要的意义。

第38页:实训指导:迷宫问题最短路径

本页为实训指导,要求在如图所示的迷宫中求从起点到终点的最短路径。图中用行列坐标标出可通行的格子,例如 0,2、0,3、0,4、0,5、1,0、1,2 等,并标出了起点与终点所在位置。

可把每个可通行格子看作图的顶点、相邻格子之间的连通关系看作边,用广度优先遍历求最少步数的走法。

顶部目录