52
数数数数数数数数C C 数数数数数数7 7 数 数 数 数

数据结构( C 语言版) 第7章  图

Embed Size (px)

DESCRIPTION

数据结构( C 语言版) 第7章  图. 内  容 7.1 图的概念 7.2 图的存贮结构 7.3 图的遍历 7.4 图的最小生成树 7.5 拓扑排序 7.6 关键路径 7.7 最短路径. 第7章 图. 7.1 图的概念. 7.1.1图的定义 - PowerPoint PPT Presentation

Citation preview

Page 1: 数据结构( C 语言版) 第7章  图

数据结构(数据结构( CC 语言版)语言版)第第 77 章  图章  图

Page 2: 数据结构( C 语言版) 第7章  图

第 7 章 图 内  容

7.1 图的概念

7.2 图的存贮结构

7.3 图的遍历

7.4 图的最小生成树

7.5 拓扑排序

7.6 关键路径

7.7 最短路径

Page 3: 数据结构( C 语言版) 第7章  图

7.1 7.1 图的概念图的概念7.1.1 图的定义 每个结点有任意多个前驱和后继结点 . 图也可以二

元组表示 :定义 Graph=(v,E) v: 表示元素集合 E: 元素之间的关系现举两个例子,如下图: [ 例一 ][ 例二 ]无向图中( 1 , 2 )和( 2 , 1 )代表同一边有向图中 <1,2> 和 <2,1> 表示两个不同的方向边以 <1,2> 为例,在 <1,2> 中:1 称为此边的起点或尾(弧尾)2 称为此边的终点或头(弧头)边的方向规定为弧尾——〉弧头

Page 4: 数据结构( C 语言版) 第7章  图

V(G1)={1,2,3,4} 顶点集合 ;E(G1)={<1,2>,<1,3>,<3,4>,<4,1>} 边的集合(顶点关系)

V(G2)={1,2,3,4,5} 顶点集合 ;E(G2)={(1,2),(1,4),(2,3),(2,5),(3,4),(3,5)} 边的集合

Page 5: 数据结构( C 语言版) 第7章  图

7.1.2 图的基本术语 1 、完全图:在一个有 N 个顶点的图中,

若每个顶点到其它( N-1 )顶点都有一条 边 , 则 图 中 有 N 个 顶 点 且 有( N* ( N-1 ) /2 )条边的图称为完全图。

2 、 邻 接 点 : 对 无 向 图G= ( V , E ),若有( V1 , V2 )属于 E 则称 V1 和 V2 互为邻接点。

3 、相关边:两个相邻接的点连成的边叫做这两个结点的相关边。

Page 6: 数据结构( C 语言版) 第7章  图

4 、度:与每个顶点相连的边的数叫该点的度。5 、入度:对有向图中某结点的弧头数(边的终点)称

为该结点的入度。6 、出度:对有向图中某结点的弧尾数(边的终点)称

为该结点的出度。7 、路径:在一图中若从某个顶点 VP 出发,沿着一些

边经过顶点 V1 , V2 ,… ,VM 到达 VG 则称路径

8 、回路:从一顶点出发又回到该顶点,则所经过的路径称为回路。

Page 7: 数据结构( C 语言版) 第7章  图

9 、子图 若 G 和 G' 是两个图,且存在着V(G')≤V(G) 和 E ( G’ )≤ E ( G )的关系,则称 G’ 是 G 的子图

10 、有关连通的概念连通:在无向图中,若从顶点 VI 到顶点 VJ 之间

有路径则称此二顶点是连通的。连通图:如果图中任意一对顶点之间都是连通的,

则称此图为连通图。强连通:对于有向图,若从顶点 VI 到顶点 VJ 到

顶点 VI 之间都有路径,则称这两点是强连通的。强连通图:图中任何一对顶点都是强连通的,则此图叫强连通图。

Page 8: 数据结构( C 语言版) 第7章  图

连通分量:非连通图中的每一个连通部分叫连通分量。

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

11 、生成树一个连通的生成树,它含有图中全部顶点,

但只有足以构成树的 N-1 条边( N 顶点个数)

如图 P159

Page 9: 数据结构( C 语言版) 第7章  图

12. 权、网权: 有些图对应每条边有一相应的数值。

这个数值叫该边的权。网: 这种带权的图叫网。 注:不同网络的权有不同的意义:电网

络权可以是阻抗,运输网络中的权可以是路程长度,运费等。

Page 10: 数据结构( C 语言版) 第7章  图

7.1.3 图的几种基本操作  (1) LOC_VERTEX(G,v) 顶点定位函数 顶点函数 : 确定顶点在图 G 中的位置 . 若图中

无此顶点,则函数值为零 .(2) GET_VERTEX(G,i) 取顶点函数 取点函数 : 求图 G 中第 i 个顶点 . 若 i> 图 G 中

顶点数则函数值为零 . (3) FIRST_ADJ(G,v) 求第一个邻接点函数 求第一个邻接点函数 : 求图 G 中顶点 V 的第

一个邻接点 . 若 v 没有邻接点或图 G 中无顶点v, 则函数值为零 .

……P156

Page 11: 数据结构( C 语言版) 第7章  图

7.2 7.2 图的存贮结构图的存贮结构7.2.1 邻接矩阵表示法 ( 数组表示法 )邻接矩阵表示法 -- 表示各顶点之间的邻接

关系 可以借助二维数组作为存贮结构 , 故又

称为数组表示法 .

Page 12: 数据结构( C 语言版) 第7章  图

7.2.2 邻接表 邻接表是由邻接矩阵改造而来的一种链

接结构 , 它只考虑非零元素 , 因而节省了零元素所占的存贮空间 .

逆邻接表 链表中每个结点表示邻接矩阵中该顶点

的列中每个非零元素

Page 13: 数据结构( C 语言版) 第7章  图

图的存贮结构说明图的存贮结构说明邻接矩阵是一个 n*n 的方阵 n 为图的顶点数

矩阵每一行分别对应图的各个顶点

矩阵的每一列分别对应图的各个顶点 1

规定矩阵元素 aij=

0

Page 14: 数据结构( C 语言版) 第7章  图

几点说明 :

1. 如果图的各边是带权的 , 也可以用邻接矩阵来表示 , 只需将矩阵中 1 元素换成相应边的权值 .

2. 邻接矩阵表示法对于以图的顶点为主的运算比较适用 .

3. 除完全图外 , 其他图的邻接矩阵有许多零元素 , 特别是当 n 值较大 , 而边数又少是 , 则此矩阵称为 " 稀疏矩阵 ". 浪费存储空间 .

Page 15: 数据结构( C 语言版) 第7章  图

邻接表与邻接矩阵的关系 : 1. 与邻接矩阵的每一行有一个线形链接表 .

2. 链接表的表头对应着邻接矩阵该行的顶点 .

3. 链接表中的每个结点对应着邻接矩阵正中该行的一个非零元素

 无向图 : 一个非零元素表示与该行顶点相邻接的另一个顶点有向图 : 非零元素则表示该行顶点为起点的一条边的终点

Page 16: 数据结构( C 语言版) 第7章  图

几点说明 : 1.在邻接表中的每个线性链接表中各结点的的顺序是任意的 .2.邻接表中的各个线性链接表不说明它们顶点之间的邻接关系 .3.对于无向图 : 某顶点的度数 =该顶点对应的线性链表的结点数  对于有向图 : 某顶点的 "出度 "数 =该顶点对应的线性链表的结点数

Page 17: 数据结构( C 语言版) 第7章  图

逆邻接表 链表中每个结点表示邻接矩阵中该顶点

的列中每个非零元素

Page 18: 数据结构( C 语言版) 第7章  图

7.3 7.3 图的遍历图的遍历什么叫图的遍历

从图的任意点出发沿着一些边访问图中的所有顶点 , 且使每个顶点仅被访问一次 ,这就叫图的遍历 .

Page 19: 数据结构( C 语言版) 第7章  图

图的遍历的两种方法图的遍历的两种方法 深度优先搜索 dfs 广度优先搜索 bfs

Page 20: 数据结构( C 语言版) 第7章  图

1.1. 深度优先搜索深度优先搜索 dfsdfs 方法 : 从图中指定的起点 v0 出发 (先访问 v)

访问它的任意相邻接的顶点 w1,再访问w1 的任一个未访问的相邻接顶点 w2,如此下去 ,直到某顶点已无被访问过的顶点 , 则返回一步找前一个顶点的其他沿未被访问的邻接顶点 ,重复以上过程直到所有的顶点都被访问

Page 21: 数据结构( C 语言版) 第7章  图

例:例:

顶点的访问序列:V1 V2 V4 V8 V5 V3 V6 V7

Page 22: 数据结构( C 语言版) 第7章  图

2.2. 广度优先搜索广度优先搜索 bfsbfs 方法 : 从图指定的起点 v0 出发 , 访问与它相

邻的所有顶点 w1,w2,.....然后再依次访问 w1,w2...... 邻接的尚未被访问的所有顶点 ,再从这些顶点出发访问与它们相邻接的尚未被访问的顶点 ,直到所有顶点均被访问过为止 .

Page 23: 数据结构( C 语言版) 第7章  图

例:例:

顶点的访问序列:V1 V2 V3 V4 V5 V6 V7 V8

Page 24: 数据结构( C 语言版) 第7章  图

7.4 7.4 图的最小生成树图的最小生成树 7.4.1 无向图的连通分量和生成树 1. 连通分量 非连通图的每一个连通部分叫连通分量 .

Page 25: 数据结构( C 语言版) 第7章  图

P159 G3 图 7.3(a)  邻接表

Page 26: 数据结构( C 语言版) 第7章  图

说明: 该图中包括三个连通分量,若按 dfs 分

别从三个顶点( I , D , B )出发可得到三个连通分量的顶点序列:

I , G , K , HD , EB , M , L , J , A , F , C

Page 27: 数据结构( C 语言版) 第7章  图

2. 图的生成树 图中全部顶点和搜索过程所经过的边 ,

构成该连通图的生成树 . 例如上图搜索遍历后得到的三棵树

Page 28: 数据结构( C 语言版) 第7章  图

   由此可以总结生成树的特点 :

任意两个顶点之间有且仅有一条路径如再增加一条边 ,就会出现一条回路 , 如果去掉一条边此子图就会变成非连通图 .

Page 29: 数据结构( C 语言版) 第7章  图

7.4.2 最小生成树 1 什么叫最小生成树 给定一个带权的无向连通图 , 如何选取

一棵生成树 , 使树上所有边上权的总和为最小 , 这叫最小生成树 .

2. 求最小生成树的算法 (1) 克鲁斯卡尔算法 (2) 普里姆算法

Page 30: 数据结构( C 语言版) 第7章  图

例:例:

Page 31: 数据结构( C 语言版) 第7章  图

克鲁斯卡尔算法 方法 : 将图中边按其权值由小到大的次序顺序选取 , 若选边后不形成回路 , 则保留作为一条边 , 若形成回路则除去 .依次选够 (n-1) 条边 ,即得最小生成树 .(n 为顶点数 )

分析:该方法对于边相对比较多的不是很实用 , 浪费时间 .

Page 32: 数据结构( C 语言版) 第7章  图

普里姆算法 方法 : 从指定顶点开始将它加入集合中 ,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边 ,并将集合外的那个顶点加入到集合中 , 表示该顶点已连通 .再用集合内的顶点与集合外的顶点构成的边中找最小的边 ,并将相应的顶点加入集合中 , 如此下去直到全部顶点都加入到集合中 ,即得最小生成树 .

Page 33: 数据结构( C 语言版) 第7章  图

7.5 7.5 有向无环图及其应用有向无环图及其应用 有向无环图 :

是一个无环的有向图 .简称 DAG 图 .

有向无环图的作用 :

常用来描述一个工程或一个系统的进行的过程 .

Page 34: 数据结构( C 语言版) 第7章  图

7.5.1 AOV 网

有向无环图可以描述一个过程或一个系统 .那么在一个过程或一个系统中又可以映射多个子过程或子系统 . 比如我们熟悉的教学计划 , 一个教学计划中又可以包含许多课程 ( 子计划 ), 当这些子计划都完成后 ,整个教学计划方算完成 .我们可以把每个子计划称为活动 .

Page 35: 数据结构( C 语言版) 第7章  图

说明: 在各个活动之间 , 有些必须按规定的先后

次序进行 , 有些则没有次序要求 .      把这种活动之间的次序要求 , 可用一个有向图来表示 .  图中每个顶点代表一个活动 . 如果从顶点 vi 到顶点 vj 之间存在有向边 <vi,vj>则表示活动 i必须先于活动 j进行 . 这种图中用顶点表示活动的网络称为 AOV 网 .

   AOV 网的特点 : 在网中一定不能有有向回路 .   检测网中是否存在环 , 可用拓扑排序的方法 .

Page 36: 数据结构( C 语言版) 第7章  图

7.5.2 7.5.2 拓扑排序拓扑排序 1. 什么叫拓扑排序

将 AOV 网中各个顶点排列成一个有序序列 , 使得所有前驱和后继关系都能得到满足 , 而那些没有次序的顶点 , 在拓扑排序的序列中可以插到任意位置 . 也可说拓扑排序是对非线形结构的有向图进行线形化的重要手段 .

Page 37: 数据结构( C 语言版) 第7章  图

2. 拓扑排序的方法

   由 AOV 网选取某个没有前驱的顶点 ,排到序列中 ,凡取出某顶点 ,即将它与它相关联的边从图中删掉 ,随着边的删除 ,又会有无前驱的顶点 ,重复如此进行 ,直到全部顶点都排到序列中去 .

例:如图 P181  图 7.27

Page 38: 数据结构( C 语言版) 第7章  图

7.6 7.6 关键路径关键路径 AOE 网 (Activity On Edge

network) ,即边表示活动的网络,与AOV 网相对应的是。它通常表示一个工程的计划或进度。

AOE 网是一个有向带权图,图中的: 边:表示活动 ( 子工程 ) , 边上的权:表示该活动的持续时间,即完成该活动所需要的时间; 顶点:表示事件,每个事件是活动之间的转接点,即表示它的所有入边活动到此完成,所有出边活动从此开始。

Page 39: 数据结构( C 语言版) 第7章  图

其中有两个特殊的顶点 ( 事件 ) ,一个称做源点,它表示整个工程的开始,亦即最早活动的起点,显然它只有出边,没有入边;另一个称做汇点,它表示整个工程的结束,亦即最后活动的终点,显然它只有入边,没有出边。除这两个顶点外,其余顶点都既有入边,也有出边,是入边活动和出边活动的转接点。

Page 40: 数据结构( C 语言版) 第7章  图

在一个 AOE 网中,若包含有 n 个事件,通常令源点为第 0 个事件,汇点为第 n-1 个事件,其余事件的编号 (即顶点序号 ) 分别为 1~n-2 。      一个 AOE 网如图,该网中包含有 活动和 事件。

如图 P183 图 7.29  一个 AOV 网

11项9 个

Page 41: 数据结构( C 语言版) 第7章  图

对于一个对于一个 AOEAOE 网,待研究的问题是:网,待研究的问题是:

(1) 整个工程至少需要多长时间完成 ?

(2) 哪些活动是影响工程进度的关键 ?

Page 42: 数据结构( C 语言版) 第7章  图

11 .事件的最早发生时间与活动的最早开始时间的关系.事件的最早发生时间与活动的最早开始时间的关系 在 AOE 网中,一个顶点事件的发生或出现必须在

它的所有入边活动 ( 或称前驱活动 ) 都完成之后,即只要有一个入边活动没有完成,该事件就不可能发生。所以: 一个事件的最早发生时间是它的所有入边活动,或者说最后一个入边活动刚完成的时间。 一个活动的开始必须在它的起点事件发生之后,也就是说,一个顶点事件没有发生时,它的所有出边活动 ( 或称后继活动 ) 都不可能开始,所以: 一个活动的最早开始时间是它的起点事件的最早发生时间。若用 ve[j] 表示顶点 vj事件的最早发生时间,用 e[i] 表示 vj 一条出边活动 ai 的最早开始时间,则有e[i]=ve[j] 。

Page 43: 数据结构( C 语言版) 第7章  图

22 .求事件的最早发生时间.求事件的最早发生时间 对于源点事件来说,因为它没有入边,

所以随时都可以发生,整个工程的开始时间就是它的发生时间,亦即最早发生时间,通常把此时间定义为 0 ,从此开始推出其他事件的最早发生时间。

例:分析图 7.29

Page 44: 数据结构( C 语言版) 第7章  图

33 .事件的最迟发生时间与活动的最迟开始时间的关系.事件的最迟发生时间与活动的最迟开始时间的关系 事件的最迟发生时间:在不影响整个工程按时完

成的前提下,一些事件可以不在最早发生时间发生,而允许向后推迟一些时间发生,我们把最晚必须发生的时间叫做该事件的最迟发生时间。 同样,在不影响整个工程按时完成的前提下,一些活动可以不在最早开始时间开始,而允许向后推迟一些时间开始,我们把最晚必须开始的时间叫做该活动的最迟开始时间。 AOE 网中的任一个事件若在最迟发生时间仍没有发生或任一项活动在最迟开始时间仍没有开始,则必将影响整个工程的按时完成,使工期拖延。

Page 45: 数据结构( C 语言版) 第7章  图

44 .求事件的最迟发生时间.求事件的最迟发生时间 dut(<jdut(<j ,, k>)k>) 表示边表示边 <<jj ,, k>k>上的权上的权

5 .根据 AOE 网中每个事件的最早发生时间和最迟发生时间计算出每个活动的最早开始时间和最迟开始时间。

Page 46: 数据结构( C 语言版) 第7章  图

关键路径关键路径 有些活动的开始时间余量不为 0 ,表明这些活动不在最早开始时间开始,至多向后拖延相应的开始时间余量所规定的时间开始也不会延误整个工程的进展。如对于活动 a5 ,它最早可以从整个工程开工后的第 4天开始,至多向后拖延两天,即从第 6天开始。 有些活动的开始时间余量为 0 ,表明这些活动只能在最早开始时间开始,并且必须在持续时间内按时完成,否则将拖延整个工期。我们把开始时间余量为 0 的活动称为关键活动,由关键活动所形成的从源点到汇点的每一条路径称为关键路径。

Page 47: 数据结构( C 语言版) 第7章  图

关键路径实际上就是从源点到汇点具有最长路径长度的那些路径,即最长路径。这很容易理解,因为整个工程的工期就是按照最长路径长度计算出来的,即等于该路径上所有活动的持续时间之和。当然一条路径上的活动只能串行进行,若最长路径上的任一活动不在最早开始时间开始,或不在规定的持续时间内完成,都必然会延误整个工期,所以每一项活动的开始时间余量为 0,故它们都是关键活动。

Page 48: 数据结构( C 语言版) 第7章  图

66 .求出关键路径的意义.求出关键路径的意义 可通过加快关键活动 (即缩短它的持续时间 ) 来实现缩短整个工程的工期。 但并不是加快任何一个关键活动都可以缩短整个工程的工期。只有加快那些包括在所有关键路径上的关键活动才能达到这个目的。

Page 49: 数据结构( C 语言版) 第7章  图

7.7 7.7 最短路径最短路径 什么是最短路径 ? 设一个带权的图表示一个交通运输网

络 , 图中各顶点可以表示城市之间的交通运输线 , 边上的权值可表示运输线路中的各种不同信息 . 如 : 可以表示两城市之间距离 , 表示所用时间 , 表示所需的费用等等 . 对不同的人所关心的信息也不同 , 但都希望所付出的代价是最小 .

Page 50: 数据结构( C 语言版) 第7章  图

最短路径的问题常见两种最短路径的问题常见两种 ::

从某源点到其余各顶点之间的最短路径 (要求 )

每一对顶点之间的最短路径 ( 不要求 )

Page 51: 数据结构( C 语言版) 第7章  图

7.7.1 从某源点到其余各顶点之间的最短路径

注 :最短路径并不一定是经过边数最少的路径

1. 迪杰斯特拉算法思路思路 :按路径由小到大的次序逐步得到由给定源点到图的其余各顶点的最短路径 .

Page 52: 数据结构( C 语言版) 第7章  图