收藏 分享(赏)

第+7+章+图.ppt

上传人:11xg27ws 文档编号:5788374 上传时间:2019-03-17 格式:PPT 页数:81 大小:1.78MB
下载 相关 举报
第+7+章+图.ppt_第1页
第1页 / 共81页
第+7+章+图.ppt_第2页
第2页 / 共81页
第+7+章+图.ppt_第3页
第3页 / 共81页
第+7+章+图.ppt_第4页
第4页 / 共81页
第+7+章+图.ppt_第5页
第5页 / 共81页
点击查看更多>>
资源描述

1、图,1、图的基本概念; 2、图的存储结构(邻接矩阵、邻接表及有向图十字邻接表); 3、图的遍历(深度优先搜索、广度优先搜索); 4、最小生成树(kruskul算法、prim算法); 5、最短路径(dijkstra算法、floyd算法); 6、AOV网络与拓扑排序; 7、AOE网络与关键路径。,教学内容,图的特点,顶点的前驱和后继个数无限制,图的应用,顶点之间的关系是任意的,图中任意两个顶点之间都可能相关,图(Graph)是一种非线性结构。,计算机科学,多对多,7.1 图的定义和术语,定义:,图是一种: 数据元素间存在多对多关系的数据结构 加上一组基本操作构成的抽象数据类型。,ADT Graph

2、 数据对象:V 是具有相同特性的数据元素的集合,称为顶点集。 数据关系:R = VR VR = | v, wV 且 P(v, w), 表示从 v 到 w 的弧, 谓词 P(v, w) 定义了弧 的意义或信息 基本操作:,定义:,图 (Graph) 是一种复杂的非线性数据结构,由 顶点集合及顶点间的关系(也称弧或边)集合组成。 可以表示为: G(V, VR) 其中 V 是顶点的有穷非空集合; VR 是顶点之间关系 的有穷集合,也叫做弧或边集合。弧是顶点的有序对, 边是顶点的无序对。,基本操作:,结构初始化 CreateGraph( 初始条件:V 是图的顶点集,VR 是图中弧的集合。 操作结果:按

3、 V 和 VR 的定义构造图 G。,销毁结构 DestroyGraph( 初始条件:图 G 存在。 操作结果:销毁图 G。,引用型操作 LocateVex(G, u); 初始条件:图 G 存在,u 和 G 中顶点有相同特征。 操作结果:若 G 中存在和 u 相同的顶点,则返回该顶点在图 中位置;否则返回其它信息。,GetVex(G, v); 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:返回 v 的值。,FirstAdjVex(G, v); 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:返回 v 的第一个邻接点。若该顶点在 G 中没有邻 接点,则返回“空”。,顶点在

4、图中的“位置”指 的是,在图的存储结构中顶 点之间自然形成的相对位置。,若G,则 称 w 为 v 的邻接点, 若(v,w)G,则称 w 和 v 互为邻接点。,NextAdjVex(G, v, w); 初始条件:图 G 存在,v 是 G 中某个顶点,w 是 v 的邻接顶点。 操作结果:返回 v 的(相对于 w 的)下一个邻接点。若 w 是 v 的最后一个邻接点,则返回“空”。,若 v 有多个邻接 点,则在图的存储结 构建立之后,其邻接 点之间的相对次序也 就自然形成了。,加工型操作 PutVex( 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:对 v 赋值 value。,Inser

5、tVex( 初始条件:图 G 存在,v 和图中顶点有相同特征。 操作结果:在图 G 中增添新顶点 v。,DeleteVex( 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:删除 G 中顶点 v 及其相关的弧。,InsertArc( 初始条件:图 G 存在,v 和 w 是 G 中两个顶点。 操作结果:在 G 中增添弧 ,若 G 是无向的,则还增添 对称弧 。,DeleteArc( 初始条件:图 G 存在,v 和 w 是 G 中两个顶点。 操作结果:在 G 中删除弧 ,若 G 是无向的,则还删除 对称弧 。,DFSTraverse(G, Visit(); 初始条件:图 G 存在,Vi

6、sit 是顶点的访问函数。 操作结果:对图 G 进行深度优先遍历。遍历过程中对每个顶 点调用函数 Visit 一次且仅一次。一旦 visit() 失败, 则操作失败。,BFSTraverse(G, Visit(); 初始条件:图 G 存在,Visit 是顶点的访问函数。 操作结果:对图 G 进行广度优先遍历。遍历过程中对每个顶 点调用函数 Visit 一次且仅一次。一旦 visit() 失败, 则操作失败。 ADT Graph,基本术语:,有向图,无向图,顶点:图中的数据元素。,弧:若 VR,则 表示从 v 到 w 的 一条弧,且称 v 为弧尾,称 w 为弧头, 此时的图称 为有向图。,G1

7、= (V1, A1) V1 = v1, v2, v3, v4 A1 = , , , ,边:若 VR 必有VR,则以无序 对 (v, w) 代表这两个有序对,表示 v 和 w 之间的一条 边,此时的图称为无向图。,G2 = (V2, E2) V2 = v1, v2, v3, v4, v5 E2 = (v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5),例:两个城市 A 和 B ,如果 A 和 B 之间的连线的涵义是表示两 个城市的距离,则 和 是相同的,用 (A, B) 表示。 如果 A 和 B 之间的连线的涵义是表示两城市之间人

8、口流动 的情况,则 和 是不同的。,无向图中边的取值范围:0en(n-1)/2。 (用 n 表示图中顶点数目,用 e 表示边的数目。且不 考虑顶点到其自身的边。),完全图:有 n(n-1)/2 条边的无向图(即:无向图 中每两个顶点之间都存在着一条边)称为完全图。,有向完全图:有 n(n-1) 条弧的有向图(即:有向 图中每两个顶点之间都存在着方向相反的两条弧)称 为有向完全图。,有向图中弧的取值范围:0en(n-1)。 (用 n 表示图中顶点数目,用 e 表示弧的数目。且不 考虑顶点到其自身的弧。),稀疏图:含有很少条边或弧的图。,稠密图:含有很多条边或弧的接近完全图的图。,权:与图的边或弧

9、相关的数,这些数可以表示从一个顶点到 另一个顶点的距离或耗费。,网: 带权的图。,子图:如果图 G = (V, E) 和 G= (V , E),满足:V V 且 E E,则称 G为G 的子图。,邻接点:若 (v, v) 是一条边,则称顶点 v 和 v互为邻接点, 或称 v 和 v相邻接;称边 (v, v) 依附于顶点 v 和 v,或称 (v, v) 与顶点 v 和 v 相关联。,若 是一条弧,则称顶点 v 邻接到 v,顶点 v 邻接自 顶点 v。并称弧 与顶点 v 和 v 相关联。,度:无向图中顶点 v 的度是和 v 相关联的边的数目,记为: TD(v)。,入度:有向图中以顶点 v 为头的弧的

10、数目称为 v 的入度,记 为:ID(v)。,出度:有向图中以顶点 v 为尾的弧的数目称为 v 的出度,记 为:OD(v)。,度:入度和出度之和,即:TD(v) = ID(v) + OD(v)。,如果顶点 vi 的度为 TD(vi),则一个有 n 个顶点 e 条边(弧) 的图,满足如下关系:,路径:从顶点 v 到 v 的路径是一个顶点序列 (v = vi, 0, vi, 1, , vi, m= v),满足 (vi, j-1, vi, j)VR 或 VR,(1 j m)。,对于有向图,路径也是有向的。,路径长度:路径上边或弧的数目。,回路(环):第一个顶点和最后一个顶点相同的路径。,简单路径:序列

11、中顶点(两端点除外)不重复出现的路径。,简单回路(简单环):前后两端点相同的简单路径。,连通:从顶点 v 到 v 有路径,则说 v 和 v 是连通的。,连通图:图中任意两个顶点都是连通的。,非连通图:有 n 个顶点和小于 n-1 条边的图。,连通分量:无向图的极大连通子图(不存在包含它的更大的 连通子图);任何连通图的连通分量只有一个,即其本身;非连 通图有多个连通分量(非连通图的每一个连通部分)。,强连通图: 任意两个顶点都连通的有向图。,强连通分量:有向图的极大强连通子图;任何强连通图的强 连通分量只有一个,即其本身;非强连通图有多个强连通分量。,生成树:所有顶点均由边连接在一起,但不存在

12、回路的图。,一个图可以有许多棵不同的生成树。,注,所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同; 生成树是图的极小连通子图; 一个有 n 个顶点的连通图的生成树有 n-1 条边; 生成树中任意两个顶点间的路径是唯一的; 在生成树中再加一条边必然形成回路。,含 n 个顶点 n-1 条边的图不一定是生成树。,生成森林:对于非连通图,其每个连通分量可以构造一棵生 成树,合成起来就是一个生成森林。,有向树:如果一个有向图恰有一个顶点的入度为 0 ,其余顶 点的入度均为 1 ,则是一棵有向树。,有向图的生成森林:由若干棵有向树组成,含有图中全部顶 点,但只有足以构成若干棵不相交的有向

13、树的弧。,7.2 图的存储结构,多重链表,7.2.1 数组表示法(邻接矩阵表示法),对于一个具有 n 个顶点的图,可用两个数组存储。其中一个 一维数组存储数据元素(顶点)的信息,另一个二维数组(图的 邻接矩阵)存储数据元素之间的关系(边或弧)的信息。,邻接矩阵:设 G = (V, VR) 是具有 n 个顶点的图,顶点的顺 序依次为 v1, v2, , vn,则 G 的邻接矩阵是具有如下性质的 n 阶 方阵:,v1 v2 v3 v4,v1 v2 v3 v4 v5,v1 v2 v3 v4,v1 v2 v3 v4 v5,特点:,无向图的邻接矩阵对称,可压缩存储;有 n 个顶点的无向图需 存储空间为

14、n(n-1)/2。,有向图邻接矩阵不一定对称;有 n 个顶点的有向图需存储空间 为 n,空间复杂度为 O(n2),用于稀疏图时空间浪费严重。,无向图中顶点 vi 的度 TD(vi) 是邻接矩阵中第 i 行 1 的个数。,有向图中,顶点 vi 的出度是邻接矩阵中第 i 行 1 的个数。,顶点 vi 的入度是邻接矩阵中第 i 列 1 的个数。,网的邻接矩阵可定义为:,v1 v2 v3 v4 v5 v6,v1 v2 v3 v4 v5 v6,图的数组(邻接矩阵)存储表示:,#define INFINITY INT_MAX / 最大值 #define MAX_VERTEX_NUM 20 / 最大顶点个数

15、 typedef enum DG, DN, AG, AN GraphKind; /有向图,有向网,无向图,无向网 typedef struct ArcCell VRType adj; / VRType是顶点关系类型。对无权图,用 1 或 0 表示相邻否; / 对带权图,则为权值类型。 InfoType *info; / 该弧相关信息的指针 ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM; typedef struct VertexType vexsMAX_VERTEX_NUM; / 顶点向量 AdjMatrix arcs; / 邻接矩阵 int v

16、exnum, arcnum; / 图的当前顶点数和弧(边)数 GraphKind kind; / 图的种类标志 MGraph;,7.2.2 邻接表(类似于树的孩子链表表示法),头结点,表结点,3,1,4,2,0,4,3,1,2,0,2,1,特点:,若无向图中有 n 个顶点、e 条边,则其邻接表需 n 个头结点和 2e 个表结点。适宜存储稀疏图。,无向图中顶点 vi 的度为第 i 个单链表中的结点数。,0,1,2,3,2,1,3,0,v1,v3,v4,v2,邻接表,逆邻接表,顶点 vi 的出度为第 i 个单链 表中的结点个数。,特点:,顶点 vi 的入度为整个单链表 中邻接点域值是 i -1 的

17、结点 个数。,找出度易,找入度难。,找入度易,找出度难。,顶点 vi 的入度为第 i 个单链 表中的结点个数。,顶点 vi 的出度为整个单链表 中邻接点域值是 i -1 的结点 个数。,图的邻接表存储表示:,#define MAX_VERTEX_NUM 20 typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位置 struct ArcNode *nextarc; / 指向下一条弧的指针 InfoType *info; / 该弧相关信息的指针 ArcNode; typedef struct VNode VertexType data; / 顶点信息 Ar

18、cNode *firstarc; / 指向第一条依附该顶点的弧 VNode, AdjListMAX_VERTEX_NUM; typedef struct AdjList vertices; int vexnum, arcnum; / 图的当前顶点数和弧数 int kind; / 图的种类标志 ALGraph;,弧结点,7.2.3 十字链表,顶点结点,#define MAX_VERTEX_NUM 20 typedef struct ArcBox int tailvex, headvex; / 该弧的尾和头顶点的位置 struct ArcBox *hlink, *tlink; / 分别指向下一个弧

19、头相同和弧尾相同的弧的指针域 InfoType *info; / 该弧相关信息的指针 ArcBox; typedef struct VexNode VertexType data; ArcBox *firstin, *firstout; / 分别指向该顶点第一条入弧和出弧 VexNode; typedef struct VexNode xlistMAX_VERTEX_NUM; / 表头向量 int vexnum, arcnum; / 有向图的当前顶点数和弧数 OLGraph;,有向图的十字链表存储表示:,7.2.3 邻接多重表(无向图的另一种链式存储结构),邻接表优点:容易求得顶点和边的信息。

20、 缺点:某些操作不方便(如:删除一条边需找表示此 边的两个结点)。,邻接多重表:每条边用一个结点表示。其结点结构如下:,标志域 标记此边是 否被搜索过,标志域 标记此边是 否被搜索过,存与顶点有关的信息,指向第一条依附于该顶点的边,#define MAX_VERTEX_NUM 20 typedef emnu unvisited, visited VisitIf; typedef struct Ebox VisitIf mark; / 访问标记 int ivex, jvex; / 该边依附的两个顶点的位置 struct EBox *ilink, *jlink; / 分别指向依附这两个顶点的下一条

21、边 InfoType *info; / 该边信息指针 EBox; typedef struct VexBox VertexType data; EBox *firstedge; / 指向第一条依附该顶点的边 VexBox; typedef struct VexBox adjmulistMAX_VERTEX_NUM; int vexnum, edgenum; / 无向图的当前顶点数和边数 AMLGraph;,无向图的邻接多重表存储表示:,7.3 图的遍历,从图的任意指定顶点出发,依照某种规则去访问图中所有顶 点,且每个顶点仅被访问一次,这一过程叫做图的遍历。,图的遍历按照深度优先和广度优先规则去

22、实施,通常有深度 优先遍历法(Depth_First SearchDFS )和 广度优先遍历法 ( Breadth_Frist SearchBFS)两种。,7.3.1 深度优先遍历(DFS),方法:1、访问指定的起始顶点; 2、若当前访问的顶点的邻接顶点有未被访问的,则任选 一个访问之;反之,退回到最近访问过的顶点;直到 与起始顶点相通的全部顶点都访问完毕; 3、若此时图中尚有顶点未被访问,则再选其中一个顶点 作为起始顶点并访问之,转 2; 反之,遍历结束。,例:,V1,顶点访问次序:,V2,V4,V8,V5,V3,V6,V7,V1,V2,V5,V8,V4,V3,V6,V7,V1,V2,V4,

23、V8,V5,V3,V7,V6,V1,V2,V5,V8,V4,V3,V7,V6,V1,V3,V6,V7,V2,V4,V8,V5,连通图的深度优先遍历类似于树的先根遍历,a,b,c,h,d,e,k,f,g,a,c,h,d,f,k,e,b,g,顶点访问次序:,例:,a,c,h,d,f,k,e,g,b,a,c,h,f,k,e,d,b,g,解决办法:为每个顶点设立一个“访问标志”。,如何判别V的邻接点是否被访问?,首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图 中每个顶点,如果未被访问,则以该顶点为起始点,进行深度 优先遍历,否则继续检查下一顶点。,1,3,7,4,0,V1,V2,V4,V8

24、,V5,V3,实现:,0 1 2 3 4 5 6 7,V1 V2 V3 V4 V5 V6 V7 V8,0 1 2 3 4 5 6 7,2,V6,5,V7,6,1,1,1,1,1,1,1,1,1,3,7,0,V1,V2,V4,V8,V5,V3,0 1 2 3 4 5 6 7,V1 V2 V3 V4 V5 V6 V7 V8,0 1 2 3 4 5 6 7,2,V6,5,V7,6,4,1,1,1,1,1,1,1,1,7.3.2 广度优先遍历(BFS),方法:从图的某一结点出发,首先依次访问该结点的所有邻 接顶点 Vi1, Vi2, , Vin 再按这些顶点被访问的先后次序依次访问 与它们相邻接的所有

25、未被访问的顶点,重复此过程,直至所有顶 点均被访问为止。,例:,广度优先遍历:,V1,V2,V3,V4,V5,V6,V7,V8,V1,V3,V2,V7,V6,V5,V4,V8,V1,V2,V3,V5,V4,V7,V6,V8,a,b,c,h,d,e,k,f,g,a,c,d,e,f,h,k,b,g,顶点访问次序:,例:,a,c,d,e,f,h,k,g,b,1,3,4,0,V1,V2,V3,V4,V5,V6,实现:,0 1 2 3 4 5 6 7,V1 V2 V3 V4 V5 V6 V7 V8,0 1 2 3 4 5 6 7,2,V7,5,V8,6,7,1,1,1,1,1,1,1,1,开始,访问V0

26、,置标志,求V邻接点w,w存在吗,V下一邻接点w,w访问过,结束,N,Y,N,Y,BFS,初始化队列,V0入队,队列空吗,队头V出队,访问w,置标志,w入队,N,Y,7.4 图的连通性问题,7.4.1 无向图的连通分量和生成树,设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图 G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G)。其中 T(G) 是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边 的集合。显然, G1(V, T) 是图 G 的极小连通子图。 即子图 G1 是连通图 G 的生成树。,深度优先生成树,广度优先生成树,所有顶点均由边 连接在一起,但 不存

27、在回路的图。,深度优先生成森林,一个连通图的生成树不一定是唯一的。,一个非连通图的生成森林不一定是唯一的。,19,17,7.4.3 最小生成树,最小生成树:给定一个无向网络,在该网的所有生成 树中,使得各边权数之和最小的那棵生成树称为该网的最 小生成树,也叫最小代价生成树。,要在 n 个城市间建立通信联络网。顶点:表示城市, 权:城市间通信线路的花费代价。希望此通信网花费代价最小。,问题提出:,答案只能从生成树中找,因为要做到任何两个城市之 间有线路可达,通信网必须是连通的;但对长度最小的要求可以 知道网中显然不能有圈,如果有圈,去掉一条边后,并不破坏连 通性,但总代价显然减少了,这与总代价最

28、小的假设是矛盾的。,希望找到一棵生成树,它的每条边上的权值之和(即建立 该通信网所需花费的总代价)最小 最小代价生成树。,问题分析:,结论:,构造最小生成树的算法很多,其中多数算法都利用了一种 称之为 MST 的性质。,MST 性质:设 N = (V, E) 是一个连通网,U 是顶点集 V 的一 个非空子集。若边 (u, v) 是一条具有最小权值的边,其中uU, vV-U,则必存在一棵包含边 (u, v) 的最小生成树。,N = (V, E),V = v1, v2, v3, v4, v5, v6,E = (v1, v2), (v1, v3), (v1, v4), (v2, v3), (v2,

29、v5), (v3, v4), (v3, v5), (v3, v6), (v4, v6), (v5, v6),U = v1,V1,构造最小生成树方法:,方法一:普里姆 (Prim) 算法。,算法思想:,设 N=(V, E) 是连通网,TE 是 N 上 最小生成树中边的集合。,初始令 U=u0, (u0V ), TE= 。,在所有 uU, vV-U 的边 (u, v)E 中, 找一条代价最小的边 (u0, v0)。,将 (u0, v0) 并入集合 TE,同时 v0 并入 U。,重复上述操作直至 U=V 为止,则 T=(V, TE) 为 N 的最小生 成树。,V1,V3,V6,V4,V2,V5,方法

30、二:克鲁斯卡尔 (Kruskal) 算法。,算法思想:,设连通网 N = (V, E ),令最小生成树初 始状态为只有 n 个顶点而无边的非连通图 T=(V, ),每个顶点自成一个连通分量。,在 E 中选取代价最小的边,若该边依附 的顶点落在 T 中不同的连通分量上(即: 不能形成环),则将此边加入到 T 中;否 则,舍去此边,选取下一条代价最小的边。,依此类推,直至 T 中所有顶点都在同一 连通分量上为止。,5,最小生成树 可能不惟一,N,T,填空题部分 1. n 个顶点的连通图至少 ( ) 条边。 2. 在一个无向图的邻接表中,若表结点的个数是 m,则图中边的 条数是 ( ) 条。,3.

31、分别用普里姆和克鲁斯卡尔算法构造题图 5-3 所示网络的最小 生成树。,作业: 7.1、7.3、7.5、7.7,4. 分别求出题图 5-1 从 v2 出发按深度优先搜索和广度优先搜 索算法遍历得到的顶点序列(假设图的存储结构采用邻接矩阵 表示)。 5. 已知一个有向图的邻接表如题图 5-2 所示,求出根据深度优 先搜索算法从顶点 v1 出发遍历得到的顶点序列。,选择题 1. 在一个图中,所有顶点的度数之和等于所有边数的 ( ) 倍。 (A)1/2 (B)1 (C)2 (D)4 2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的 ( ) 倍。 (A)1/2 (B)1 (C)2 (D

32、)4 3. 一个有 n 个顶点的无向图最多有 ( ) 条边。 (A)n (B)n(n -1) (C)n(n-1)/2 (D)2n 4. 具有 4 个顶点的无向完全图有 ( ) 条边。 (A)6 (B)12 (C)16 (D)20 5. 具有 6 个顶点的无向图至少应有 ( ) 条边才能确保是一个连通图。 (A)5 (B)6 (C)7 (D)8 6. 在一个具有 n 个顶点的无向图中,要连通全部顶点至少需要 ( ) 条边。 (A)n (B)n + 1 (C)n 1 (D)n/2,对于一个具有 n 个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小 为 ( )。 (A)n (B)(n-1)2 (C

33、)n -1 (D)n2 对于一个具有 n 个顶点和 e 条边的无向图,若采用邻接表表示,则表头数 组的大小为 ( ),所有邻接表中的结点总数是 ( )。 (A)n (B)n+1 (C)n-1 (D)n+e (A)e/2 (B)e (C)2e (D)n+e 图的深度优先遍历算法类似于树的( )。 (A)先根遍历 (B)后根遍历 (C)按层遍历 图的广度优先遍历算法类似于树的( )。 (A)先根遍历 (B)后根遍历 (C)按层遍历,7.5 有向无环图及其应用,有向无环图:无环的有向图, 简称 DAG (Directed Acycline Graph)图。,有向树,有向无环图,有向图,1、描述含有公

34、共子式的表达式:,有向无环图的用途:,共享相同子式 节省存储空间,除最简单的情况之外,几乎所有的工程都可分为若干个称 作“活动”的子工程,并且这些子工程之间通常受着一定条件的 约束,例如:其中某些子工程必须在另一些子工程完成之后才 能开始。,对整个工程和系统,人们关心的是两方面的问题: 一是工程能否顺利进行; 二是完成整个工程所必须的最短时间。,2、在工程计划和管理方面的应用,对应到有向图即为进行拓扑排序和求关键路径。,7.5.1 拓扑排序,AOV 网:,用一个有向图表示一个工程的各子工程及其相互 制约的关系,其中以顶点表示活动,弧表示活动之间 的优先制约关系,称这种有向图为顶点表示活动的网

35、, 简称 AOV (Activity On Vertex network) 网。,例:排课表。,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,若 是网中有向边,则 i 是 j 的直接前驱; j 是 i 的直接后继。,AOV 网中不允许有回路,因为如 果有回路存在,则表明某项活动以 自己为先决条件,显然这是荒谬的。,问题:如何判别 AOV 网中是否存在回路?,AOV 网的特点:,若从 i 到 j 有一条有向路径,则 i 是 j 的前驱;j 是 i 的后继。,拓扑排序:,检测 AOV 网中是否存在环方法: 对有向图构造其顶点 的拓扑有序序列,若网中所有顶点都在它的拓

36、扑有序序列中, 则该 AOV 网必定不存在环。,在 AOV 网没有回路的前提下,我们将全部活动 排列成一个线性序列,使得若 AOV 网中有弧 存在,则在这个序列中, i 一定排在 j 的前面,具有 这种性质的线性序列称为拓扑有序序列,相应的拓扑 有序排序的算法称为拓扑排序。,拓扑排序的方法:,在有向图中选一个没有前驱的顶点且输出之。,从图中删除该顶点和所有以它为尾的弧。,重复上述两步,直至全部顶点均已输出;或者当图中不存在无 前驱的顶点为止,C9, C10, C11, C6, C1, C12, C4, C2, C3, C5, C7, C8,拓扑序列:,C1,C2,C3,C4,C5,C7,C9,

37、C10,C11,C6,C12,C8,一个AOV网的拓扑序列不是唯一的,例:设一个工程有 11 项活动, 9 个事件。 事件 v1 表示整个工程 开始(源点) 事件 v9 表示整个工程 结束(汇点),7.5.2 关键路径,把工程计划表示为有向图,用顶点表示事件,弧表示活动, 弧的权表示活动持续时间。每个事件表示在它之前的活动已经完 成,在它之后的活动可以开始。称这种有向图为边表示活动的网 络,简称为AOE (Activity On Edge)网。,对于AOE网,我们关心两个问题: (1) 完成整项工程至少需要 多少时间? (2) 哪些活动是影响工程进 度的关键?,路径长度 路径上各活动持续时间之

38、和。,关键路径 路径长度最长的路径。,ve(j) 表示事件 vj 的最早发生时间。,vl(j) 表示事件 vj 的最迟发生时间。,e(i) 表示活动 ai 的最早开始时间。,l(i) 表示活动 ai 的最迟开始时间。,l(i) - e(i) 表示完成活动 ai 的时间余量。,关键活动 关键路径上的活动,即 l(i) = e(i) 的活动。,ve(3) = 4,vl(3) = 6,e(5) = 4,l(5) = 6,l(5) - e(5) = 2,如何找 l(i) = e(i) 的关键活动?,设活动 ai 用弧 表示,其持续时间记为:dut() 则有: (1) e(i) = ve(j) (2)

39、l(i) = vl(k) - dut(),(1) 从 ve(1) = 0 开始向前递推,(2) 从 vl(n) = ve(n) 开始向后递推,如何求 ve(j) 和 vl(j) ?, ,求关键路径步骤: 求 ve(i)、vl(j) 求 e(i)、l(i) 计算 l(i) - e(i),064577 16 14 18,06687 10 16 14 18,关键路径的讨论,1、若网中有几条关键路径, 则需加快同时在几条关键 路径上的关键活动。如:a11、a10、a8、a7。,2、如果一个活动处于所有的关键路径上,那么提高这个活动的 速度,就能缩短整个工程的完成时间。如:a1、a4。,3、处于所有的关

40、键路径上的活动完成时间不能缩短太多,否则 会使原来的关键路径变成不是关键路径。这时,必须重新寻 找关键路径。如:a1由 6 天变成 3 天,就会改变关键路径。,作业:7.9、7.10,7.6 最短路径,典型用途:交通网络的问题从甲地到乙地之间是否有公 路连通?在有多条通路的情况下,哪一条路最短?,交通网络用有向网来表示:顶点表示城市,弧表示 两个城市有路连通,弧上的权值表示两城市之间的距离、交 通费或途中所花费的时间等。,如何能够使一个城市到另一个城市的运输时间最短或运费最 省?这就是一个求两座城市间的最短路径问题。,问题抽象:在有向网中 A 点(源点)到达 B 点(终点)的 多条路径中,寻找

41、一条各边权值之和最小的路径,即最短路径。,注,最短路径与最小生成树不同, 路径上不一定包含 n 个顶点,也不一定包含 n - 1 条边。,13,(v0, v1),(v0, v2),(v0, v2, v3),(v0, v2, v3, v4),(v0, v2, v3, v4, v5),(v0, v1, v6),8,13,19,21,20,从 v1 到 v7 的路径: v1、v2、v5、v7:20 v1、v4、v2、v5、v7:14 v1、v2、v7:23 v1、v4、v2、v7:17 v1、v4、v6、v7:24,例:,源点,终点,两种最常见的 最短路径问题,单源点最短路径,所有顶点间的最短路径,

42、从某个源点到其余 各顶点的最短路径,每对顶点间 的最短路径,7.6.1 单源点最短路径(从某个源点到其余各顶点的最短路径),怎样求单源点的最短路径呢?,2、迪杰斯特拉(Dijkstra)算法: 按路径长度递增次序产生各顶点的最短路径。,1、将源点到终点的所有路径都列出来, 然后在其中选最短的一条。,缺点:当路径特别多时,特别麻烦;没有规律可循。,路径长度最短的最短路径的特点:,在此路径上,必定只含一条弧 ,且其权值最小。,它只可能有两种情况: 1)、直接从源点到 v2 (只含一条弧);,下一条路径长度次短的最短路径的特点:, ,由此,只要在所有从源点出发的弧中查找权值最小者。,2)、从源点经过

43、顶点 v1,再到达 v2 , (由两条弧组成)。,v1 必为已求得的最短路径上的顶点,可能有四种情况: 1)、直接从源点到 v3 (由一条弧组成); 2)、从源点经过顶点 v1,再到达 v3 , (由两条弧组成); 3)、从源点经过顶点 v2,再到达 v3 , (由两条弧组成); 4)、从源点经过顶点 v1, v2,再到达 v3 , , (由三条弧组成);,再下一条路径长度次短的最短路径的特点:, , , ,v1,v2 必为已求得的最短路径上的顶点,其余最短路径的特点:,1)、直接从源点到 vi (只含一条弧); 2)、从源点经过已求得的最短路径上的顶点,再到达 vi (含有多条弧)。,迪杰斯

44、特拉 (Dijkstra) 算法:按路径长度递增次序产生最短路径,1、把 V 分成两组: (1) S:已求出最短路径的顶点的集合。 (2) V - S = T:尚未确定最短路径的顶点集合。 2、将 T 中顶点按最短路径递增的次序加入到 S 中, 保证: (1) 从源点 v0 到 S 中各顶点的最短路径长度都不大于从 v0 到 T 中任何顶点的最短路径长度。 (2) 每个顶点对应一个距离值: S 中顶点:从 v0 到此顶点的最短路径 长度。 T 中顶点:从 v0 到此顶点的只包括 S 中顶点作中间顶点的 最短路径长度。,Dijkstra 算法步骤:,T 中顶点对应的距离值用辅助数组 D 存放。,

45、Di 初值:若 存在,则为其权值;否则为。,v2,13 8 30 32,v2,8,1313 30 32,v3,v1,v1,13,13 30 22 20,v3,8+5,19 22 20,v4,v4,8+5+6,21 20,v6,v5,13+7,21,v5,v6,初始时令 S=v0, T=其余顶点。,v0,从 T 中选取一个其距离值最小的顶点 vj,加入 S。,对 T 中顶点的距离值进行修改:若加进 vj 作中间顶点,从 v0 到 vi 的距离值比 不加 vj 的路径要短,则修改此距离值。,重复上述步骤,直到 S = V 为止。,8+5 +6+2,7.6.2 每一对顶点之间的最短路径,方法一:每次

46、以一个顶点为源点, 重复执行 Dijkstra 算法 n 次。,若 存在,则存在路径 vi, vj / 路径中不含其它顶点 若 , 存在,则存在路径 vi, v0, vj / 路径中所含顶点序号不大于 0 若vi, , v1, v1, , vj 存在,则存在路径 vi, , v1, , vj / 路径中所含顶点序号不大于 1 ,方法二:弗洛伊德 (Floyd) 算法,算法思想:逐个顶点试探,从 vi 到 vj 的所有可能存在的路 径中,选出一条长度最短的路径。,求最短路径步骤:,初始时设置一个 n 阶方 阵,令其对角线元素为 0, 若存在弧,则对应元 素为权值;否则为。,逐步试着在原直接路径 中增加中间顶点,若加入中 间顶点后路径变短,则修改 之;否则,维持原值。所有 顶点试探完毕,算法结束。,1、理解图的基本概念,熟悉图的各种存储结构及其 构造方法; 2、熟练掌握图的两种遍历方法; 3、熟练掌握构造最小生成树的方法,并理解算法; 4、掌握求 AOV 网的拓扑排序的方法,并理解算法; 5、掌握求解关键路径的方法; 6、理解用 Dijkstra 方法求解单源点最短路径问题。,教学要求,作业:7.11、7.13,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报