1、教 案 封 皮开课单位 信息工程学院 课程名称 数据结构授课教师 郭晓利 授课对象 计机、软件 12 合选用教材 数据结构 总学时 2课次 19 第 六 章 第 节教学目的及要求 使学生掌握图的定义、基本术语和存储结构教学重点 图的定义、基本术语和存储结构教学难点 图的存储结构教学方式、方法 理论教学、多媒体授课教学过程及时间分配第一学时(45 分钟)复习(5 分)图的定义及基本术语(40 分)第二学时(45 分钟)图的存储结构(40 分)课后小结(5 分)教 案内 容 备 注复习:1、 什么是树、二叉树、线索二叉树、哈夫曼树?61 图的基本概念611 图的定义图的定义:一个图 G 是由两个集
2、合 V 和 E 组成,V 是有限的非空顶点集,E 是 V上的顶点对所构成的边集,分别用 V(G)和 E(G)来表示图中的顶点集和边集。用二元组G=(V,E)来表示图 G。图 6.1 几种图的示例图的基本操作至少包括:(1)CreateGraph(G):创建图 G。(2)DestoryGraph(G):销毁图 G。(3)LocateVertex(G,v) :确定顶点 v 在图 G 中的位置。若图 G 中没有顶点 v,则函数值为“空” 。(4)GetVertex(G,i) :取出图 G 中的第 i 个顶点的值。若 i 大于图 G 中顶点数,则函数值为“空” 。(5)FirstAdjVertex(G
3、,v) :求图 G 中顶点 v 的第一个邻接点。若 v 无邻接点或图G 中无顶点 v,则函数值为“ 空” 。(6)NextAdjVertex(G,v,w):已知 w 是图 G 中顶点 v 的某个邻接点,求顶点 v的下一个邻接点(紧跟在 w 后面) 。若 w 是 v 的最后一个邻接点,则函数值为“空” 。(7)InsertVertex(G,u):在图 G 中增加一个顶点 u。(8)DeleteVetrex(G,v):删除图 G 的顶点 v 及与顶点 v 相关联的弧。(9)InsertArc(G,v,w) :在图 G 中增加一条从顶点 v 到顶点 w 的弧。(10)DeleteArc(G,v,w)
4、:删除图 G 中从顶点 v 到顶点 w 的弧。612 图的基本术语有关图的一些基本术语定义如下。(1)无向图和有向图对于一个图 G,若边集 E(G)为无向边的集合,则称该图为无向图。 对于一个图 G,若边集 E(G)为有向边的集合,则称该图为有向图。 (2)端点和邻接点在一个无向图中,若存在一条边(vi,vj),则称 vi、vj 为该边的两个端点,并称它们互为邻接点。 (3)起点和终点在一个有向图中,若存在一条边 ,则称该边是顶点 vi 的一条出边,顶点vj 的一条入边;并称 vi 为起始端点(或起点) ,vj 为终止端点( 或终点); (4)度、入度和出度对于无向图,顶点 v 的度是和 v
5、相关联的边的数目,记做 D(v)。 以顶点 v 为头的弧的数目称为 v 的入度,记 ID(v) ;以顶点 v 为尾的弧的数目称为 v 的出度,记 OD(v); 顶点 v 的度为 D(v) = ID(v) + OD(v)。 (5)子图假设有两个图 G=(V, E) 和 G=(V, E) ,如果 V V,且 E E,则称 G 为 G 的子图。 (6)无向完全图和有向完全图对于无向图,若具有 n(n-1)/2 条边,则称之为无向完全图 。对于有向图,若具有 n(n-1)条边,则称之为 有向完全图。(7)稀疏图和稠密图边较少(边数 en;i+) /*给 visited 数组置初值 0*/visited
6、i=0;visitedvi=1; /*访问初始顶点 */printf(“%d ”,vi);rear=(rear+1)%MAXVEX;Qurear=vi; /*初始顶点入队列*/while(front!=rear) /*队列不为空时循环*/front=(front+1)%MAXVEX;v=Qufront; /*出队列*/p=g- listv. firstarc ; /*查找 v 的第一个邻接点*/while(p!=NULL) /*查找 v 的所有邻接点*/ if(visitedp-adjvexpos=0) /*未访问过则访问之 */ visitedp-adjvexpos=1;printf(“%d
7、“,p-adjvexpos);/*访问该点并使之入队列 */rear=(rear+1)%MAXVEX;Qurear=p-adjvexpos;p=p-next; /*查找 v 的下一个邻接点*/632 深度优先搜索深度优先搜索(depth-first search 简称 DFS)遍历算法是一种回溯算法的思想,类似于树的先根序遍历过程。深度优先搜索(DFS)的基本思想是:从图 G 中某个顶点 vi 出发,访问 vi,然后选择一个与 vi 相邻且没被访问过的顶点 v 访问,再从 v 出发选择一个与v 相邻且未被访问的顶点 vj 访问,依次继续。如果当前已访问过的顶点的所有邻接项点都已被访问,则回退到
8、已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点 w,从 w 出发按同样方法向前遍历, 直到图中所有顶点都被访问。在对一个无向图进行深度优先搜索遍历时,如果把搜索过程中经过的顶点与边组合起来便获得该无向图的深度优先搜索生成森林(depth-first search spanning forest) ,图 6.13 所示的图 G 的深度优先搜索生成森林如图 6.15 所示。图 6.15 图 G 的深度优先搜索生成森林实现深度优先搜索的非递归算法如下:【算法 6.3】 void DFS (ALGraph *g,int vi) /*从 vi 出发深度优先搜索图 g*/ InitStack(S
9、); /*初始化空栈*/Push(S,vi);while(!Empty(S)v=Pop(S);if(!visited(v) visit(v);visitedv=True;w=FirstAdj(g,v); /*求 v 的第一个邻接点*/while(w!=-1)if(!visited(w)Push(S,w);w=NextAdj(g,v,w); /*求 v 相对于 w 的下一个邻接点 */课后小结:1、深度优先搜索2、广度优先搜索3、图的存储教 案 封 皮开课单位 信息工程学院 课程名称 数据结构授课教师 郭晓利 授课对象 计机、软件 12 合选用教材 数据结构 总学时 2课次 21 第 五 章 第
10、 节教学目的及要求掌握图的连通性教学重点 图的连通性教学难点 克鲁斯卡尔算法、普里姆算法教学方式、方法 理论教学、多媒体授课教学过程及时间分配第一学时(45 分钟)复习(5 分)克鲁斯卡尔算法(40 分)第二学时(45 分钟)普里姆算法(40 分)课后小结(5 分)教 案内 容 备 注复习:1、深度优先搜索2、广度优先搜索64 图的连通性一个无向连通图可能有多棵形态不同的生成树,例如,对该无向连通图进行一次深度优先搜索便可以得到深度优先搜索生成树,对该无向连通图进行一次广度优先搜索便可以得到广度优先搜索生成树。在一个赋权无向连通图的所有生成树中,生成树各边上权值的总和最小的生成树称为最小生成树
11、(minimal spanning tree) 。在现实生活中,有很多问题可以归结为求取最小生成树问题。例如,有 7 个村庄(A、B、C、D、E、F 和 G) ,现在要修路使这 7 个村庄相互连通,根据调查发现可以修路的线路及按该线路修路需要的费用(权值)如图 6.16 所示,要求找一个总费用最少的修路方案。图 6.16 一个赋权无向图那么,如何求取最小生成树呢?构造一棵最小生成树通常有两种方法:普里姆算法和克鲁斯卡尔算法,下面分别来介绍。6.4.1 普里姆算法普里姆(prim)算法原理是:从赋权无向图 V 中取一个顶点(通常是 0 号顶点)作为一棵树 U,然后从图 V 中滤出一条边,要求该边
12、上的权值尽可能小并且该边两端的顶点中必须有且只有一个顶点是已经在树 U 中的,把该边及该边的另一端的顶点加入树 U 中,这样一来,树 U 便增加了一个顶点和一条边,按这个规则继续从图中滤出边加到树 U 中并扩充树 U 中的顶点,直到生成的树包含图中所有的顶点为止。采用普里姆算法原理来创建图 6.16 所示的赋权无向图最小生成树的过程如图 6.17 所示。图 6.17 普里姆算法创建最小生成树过程示意图为了便于在集合 U 和(V-U)之间选择权最小的边,建立了两个数组 closest 和lowcost,分别用于存放顶点序号和权值,closesti 表示一个已在 U 中的顶点。它们之间的关系及意义
13、为:若 lowcosti=0,则表明 i 在 U 中;若 0的权值。若不存在有向边,则 costij的权为无穷大( )。设置一维数组 s0, ,n-1 ,用于标记已找到最短路径的顶点。设顶点 v 为源点,集合 s 的初态只包含顶点 v。即:costij= 其 他,且若 jijiij Ew)(0以下用 INF 表示,通常取大于最大权值的某个数值。设置一维数组s0n-1,用于标记已找到最短路径的顶点,并规定:si= 的 最 短 路 径已 找 到 源 点 到 顶 点 的 最 短 路 径未 找 到 源 点 到 顶 点 iv106.5.2 每对顶点之间的最短路径求解每对顶点之间的最短路径的一个办法是:每
14、次以一个顶点为源点,重复执行 Dijkstra 算法 n 次,这样便可以求得每一对顶点之间的最短路径。解决该问题的另一种方法是弗洛伊德(Floyed)算法。它仍是从图的带权邻接矩阵 cost 出发,其基本思想是:如果从 vi 到 vj 有边,则从 vi 到 vj 存在一条长度为 costij的路径。该路径不一定是最短路径,尚需进行 n 次试探。首先考虑路径(v i,v0,vj)是否存在( 即判断弧(v i,v0)和(v 0,vj)是否存在)。如果存在,则比较其路径长度。取长度较短者为从 vi 到 vj 的中间顶点的序号不大于 0 的最短路径。假如在路径上再增加一个顶点 v1,即如果(v i ,
15、v 1)和 (v1, ,vj)分别是当前找到的中间顶点的序号不大于 0 的最短路径,那么,(v i, ,v 1,v j)就有可能是从 vi 到 vj 中间顶点的序号不大于 l 的最短路径。将它和已经得到的从 vi到 vj 中间顶点的序号不大于 0 的最短路径相比较,从中选出中间顶点的序号不大于 1 的最短路径之后,再增加一个顶点 v2,继续进行试探。依此类推,直至经过 n 次比较,最后求得的必是从 vi 到 vj 的最短路径。按此方法,可以同时求得各对顶点间的最短路径。现定义一个 n 阶方阵序列:A -1,A 0, ,A k,A n-1,其中:A-1ij=costij (0in-1 ,0j n
16、-1)Ak+1ij=minAkij,Akik+1+Akk+1j (-1kn-2 )从上述计算公式可见,A kij是从 vi 到 vj 的中间顶点的序号不大于 k 的最短路径的长度;A n-1ij就是从 vi 到 vj 的最短路径。课后小结:1. 狄克斯特拉(Dijkstra)算法2. 弗洛伊德(Floyed)算法教 案 封 皮开课单位 信息工程学院 课程名称 数据结构授课教师 郭晓利 授课对象 计机、软件 12 合选用教材 数据结构 总学时 2课次 23 第 五 章 第 节教学目的及要求使学生掌握 AOE 网与关键路径和 AOV 网与拓扑排序教学重点 AOE 网与关键路径和 AOV 网与拓扑排
17、序教学难点 AOE 网与关键路径和 AOV 网与拓扑排序教学方式、方法 理论教学、多媒体授课教学过程及时间分配第一学时(45 分钟)复习(5 分)AOE 网与关键路径 40 分)第二学时(45 分钟)AOV 网与拓扑排序(40 分)课后小结(5 分)教 案内 容 备 注复习:1. 狄克斯特拉(Dijkstra)算法2. 弗洛伊德(Floyed)算法66 AOV 网与拓扑排序如果用一个有向图代表一个完整的任务,图中的每个顶点代表一个活动(activity ) ,而弧代表活动的先后顺序,这样的有向图就称为 AOV 网(activity on vertex network) 。拓扑排序(topolo
18、gical sort)是把一个 AOV 网中的顶点转换成一个线性序列,AOV 网中有些顶点是有优先关系的,但有些顶点并不存在优先关系,这时就要人为地加入一些优先关系。以图 6.22 表示的 AOV 网为例,进行拓扑排序可以得到以下的线性序列:CADBFGE、CGADBE 和 CDAFBGE 等等。图 6.22 一个 AOV 网拓扑排序的方法如下:(1)在有向图中选择一个入度为 0 的顶点 vi 输出。(2)从有向图中把顶点 vi 删除,并删除所有以 vi 为弧尾顶点的弧。重复以上两步,直到没有顶点或没有入度为 0 的顶点为止。显然,如果拓扑排序后得到的序列里包含了有向图中的全部顶点,则原有向图
19、中必然无环,否则,原有向图中必然有环。为了实现拓扑排序的算法,对于给定的有向图,采用邻接表作为存储结构,为每个顶点设立一个链表,每个链表有一个表头结点,这些表头结点构成一个数组,表头结点中增加一个存放顶点入度的域 count。即将邻接表定义中的VNode 类型修改如下:typedef struct /*表头结点类型 */ Vertex data; /*顶点信息*/int count; /*存放项点入度*/RNode *firstarc; /*指向第一条弧*/ VNODE;6.7 AOE 网与关键路径如果用一个赋权有向图代表一个完整的任务,图中的每个顶点代表一个事件(event ) ,而弧代表活
20、动,弧上的权值代表活动持续的时间(或其他信息) ,这样的有向图就称为 AOE 网(activity on edge) 。e4e1 1e7e1e2e5e8e1 0e3e6e9a7= 6 a1 1= 7a3= 2a1= 3a2= 4 a6= 5 a1 0= 2a1 4= 1a1 5= 6a9= 4a8= 8a5= 3a1 3= 1 0a1 2= 4a4= 1图 6.23 一个 AOE 网如果用 AOE 网来表示一项工程,如图 6.23 所示,其中 e1 表示工程开始点,e11 表示工程结束点,其他的 ei 表示其他的工程事件,a i 表示各项工程活动,a i的值表示活动所需要的时间。这时,最关心问
21、题通常有两个:一是整个工程需要的时间是多少?二是哪些活动的提前或延期将直接影响整个工程的进度?这两个问题都可以归结为求解关键路径问题,所谓关键路径(critical path)是指从工程开始点到工程结束点所经过的各条路径中时间耗费总量(即:路径上的各个活动所需时间之和)最大的路径。关键路径上的时间耗费总量就是整个工程需要的时间,而直接影响整个工程的进度的活动就是关键路径上的活动。为了在 AOE 网中找出关键路径,下面定义四个术语:(1)事件的最早发生时间事件的最早发生时间 ee(k)是指从工程开始点 e1 到顶点 ek 所耗费的最长时间。这个时间决定了所有从顶点 ek 发出的弧所代表的活动能够
22、开工的最早时间。显然,只有进入 ek 的所有活动都结束时,e k 代表的事件才能发生,而活动的最早结束时间为 ee(j) + 上的权值。假设 ee(1)=0,则ek 的最早发生时间为:ee(k)=maxee(j) + 上的权值 P其中,max 表示取最大值,P 表示所有以 ek 的弧头顶点的弧的集合。(2)事件的最迟发生时间事件的最迟发生时间 le(k)是指在不推迟整个工期的前提下,事件 ek 允许的最晚发生时间。设弧代表从 ek 出发的活动,为了不拖延整个工期,ek 发生的最迟时间必须保证不推迟从事件 ek 出发的所有活动的终点 ej的最迟时间 le(j)。对一个工程而言,工程结束事件的最早
23、发生时间与最迟发生时间当然是相等的,即,le(n )=ee(n ),其中 n 是 AOE 网中顶点的个数。那么,ek 的最迟发生时间为:le(k)=minle(j) - 上的权值 S其中,min表示取最小值,S 为所有以 ek 为弧尾顶点的弧的集合。(3)工程活动 ai 的最早开工时间若工程活动 ai 是由弧 表示,显然,只有事件 ek 发生了,工程活动 ai才能开工。也就是说,工程活动 ai 的最早开工时间 e(i)应等于事件 ek 的最早发生时间。即,e(i)=ee(k)。(4)工程活动 ai 的最晚开工时间工程活动 ai 的最晚开工时间是指在不推迟整个工期的前提下,a i 必须开工的最晚
24、时间。若 ai 由弧表示,则 ai 的最晚开工时间要保证事件 ej 的最迟发生时间不受影响。因此,工程活动 ai 的最晚开工时间为:l(i)=le(j) - 上的权值一个活动 ai 的最迟开始时间 l(i)和其最早开始时间 e(i)的差额 d(i)=l(i)-e(i)是该活动完成的时间余量。它是在不增加完成整个工程所需的总时间的情况下,活动 ai 可以拖延的时间。当一活动的时间余量为零时,说明该活动必须如期完成,否则就会拖延整个工程的进度。所以我们称 l(i)-e(i)=0,即 l(i)=e(i)时的活动 ai 是关键活动。由上述方法得到求关键路径的算法步骤为:(1)从入度为 0 的工程开始点 e1 出发,令 ee1=0,按正向拓扑排序顺序求其余各事件的最早发生时间 eei(2in )。如果得到的正向拓扑序列中事件顶点个数小于 AOE 网中顶点数 n,则说明网中有环,操作失败,结束;否则继续下一步。(2)从出度为 0 的工程结束点 en 出发,令 len =een ,按逆向拓扑排序顺序求其余各事件的最迟发生时间 lei(2i n-1 );(3)根据各事件顶点的 ee 和 le 值,求每个工程活动的最早开工时间 e 和最迟开工时间 l。若某个工程活动的最早开工时间 e 和最迟开工时间 l 相等,则为关键活动。课后小结:1. AOE 网与关键路径2. AOV 网与拓扑排序