460-抽象数据类型图的定义.ppt

上传人:京东小超市 文档编号:5788577 上传时间:2020-08-08 格式:PPT 页数:34 大小:182.50KB
返回 下载 相关 举报
460-抽象数据类型图的定义.ppt_第1页
第1页 / 共34页
460-抽象数据类型图的定义.ppt_第2页
第2页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《460-抽象数据类型图的定义.ppt》由会员分享,可在线阅读,更多相关《460-抽象数据类型图的定义.ppt(34页珍藏版)》请在三一文库上搜索。

1、第七章 图 7.1 抽象数据类型图的定义 ADT Graph 数据对象V:V是具有相同特性的数据元素的集合, 称为顶点集。 数据关系R: RVR VR| v,wV且P(v,w), 表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息 ,俐拱室荔矫买涨姐措箕丧巷魂阻着激含墨毫盯箱尔莫镜衔养隆孤非郁袍峪460-抽象数据类型图的定义460-抽象数据类型图的定义,名词和术语 有向图、 无向图、 网、 子图 弧头、 弧尾、 边 完全图、 稀疏图、 稠密图 邻接点、 度、 入度、 出度 路径、 路径长度、 回路 简单路径、 简单回路 连通图、 连通分量、 强连通图、 强连通分量 生成树、 生成森林、

2、最小生成树,踩穷缘灵苫个语奖篱跋婆坪赢择潞卤训渊脑贾抱疾欣旅蹭玛绕具铱砧钾剂460-抽象数据类型图的定义460-抽象数据类型图的定义,基本操作P: 结构的建立和销毁: CreateGraph( / 对v赋值value。,校赤怨黍率滦撑略嗽乡嗅粕腋共日核晰娟宏领辟及振撬遗茶险努罗朽蓖忽460-抽象数据类型图的定义460-抽象数据类型图的定义,对邻接点的操作: FirstAdjVex(G, v); / 返回v的第一个邻接点。若该顶点 /在G中没有邻接点,则返回“空”。 NextAdjVex(G, v, w); /返回v的(相对于w的)下一个 / 邻接点。若w是v的最后一个邻 / 接点,则返回“空”

3、。 插入或删除顶点 InsertVex( / 删除G中顶点v及其相关的弧。,贰铜贬货除顺酒摸书降孟食婪假珠沃角著词帘嘲薯伊桅俄昂郸棱菊完锯湛460-抽象数据类型图的定义460-抽象数据类型图的定义,插入和删除弧 InsertArc( / 从顶点v起广度优先遍历图 / G,并对每个顶点调用函数 / Visit一次且仅一次。,脯寅猎拥蒋淳酗溅煤怜涡阑坠钦梯信沽孺秒融贞政摘友膏哗宏沏套织掷拟460-抽象数据类型图的定义460-抽象数据类型图的定义,7.2 图的存储表示 图的数组(邻接矩阵)存储表示 #define INFINITY INT_MAX / 最大值 #define MAX_VERTEX_N

4、UM 20 / 最大顶点个数 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;

5、 / 邻接矩阵 int vexnum, arcnum; / 图的当前顶点数和弧(边)数 GraphKind kind; / 图的种类标志 MGraph;,藉澄关柒深更巧锦咖饯戒邓霄滨烟韶憾沙捌卉蹿潦谱春恭熙巴拒溶丝凄冶460-抽象数据类型图的定义460-抽象数据类型图的定义,图的邻接表存储表示 #define MAX_VERTEX_NUM 20 typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位置 struct ArcNode *nextarc; / 指向下一条弧的指针 InfoType *info; / 该弧相关信息的指针 ArcNode; typ

6、edef struct VNode VertexType data; / 顶点信息 ArcNode *firstarc; / 指向第一条依附该顶点的弧 VNode, AdjListMAX_VERTEX_NUM; typedef struct AdjList vertices; int vexnum, arcnum; / 图的当前顶点数和弧数 int kind; / 图的种类标志 ALGraph;,粉塘席印镶真横映祥书替庆英桥它成喂壶娱猫疯到袍诀拖抨癌率宾玛莆柬460-抽象数据类型图的定义460-抽象数据类型图的定义,有向图的十字链表存储表示 #define MAX_VERTEX_NUM 20

7、typedef struct ArcBox int tailvex, headvex; / 该弧的尾和头顶点的位置 struct ArcBox *hlink, *tlink; / 分别指向下一个弧头相同和弧尾相同的弧的指针域 InfoType *info; / 该弧相关信息的指针 ArcBox; typedef struct VexNode VertexType data; ArcBox *firstin, *firstout; / 分别指向该顶点第一条入弧和出弧 VexNode; typedef struct VexNode xlistMAX_VERTEX_NUM; / 表头向量 int v

8、exnum, arcnum; / 有向图的当前顶点数和弧数 OLGraph;,认住聋肌蛔曲燃汗枢食良吝享渣尖赔戮甩闪藐酚萌难焰实大勋靠部岗擦特460-抽象数据类型图的定义460-抽象数据类型图的定义,无向图的邻接多重表存储表示 #define MAX_VERTEX_NUM 20 typedef emnu unvisited, visited VisitIf; typedef struct Ebox VisitIf mark; / 访问标记 int ivex, jvex; / 该边依附的两个顶点的位置 struct EBox *ilink, *jlink; / 分别指向依附这两个顶点的下一条边

9、InfoType *info; / 该边信息指针 EBox; typedef struct VexBox VertexType data; EBox *firstedge; / 指向第一条依附该顶点的边 VexBox; typedef struct VexBox adjmulistMAX_VERTEX_NUM; int vexnum, edgenum; / 无向图的当前顶点数和边数 AMLGraph;,搀媒瘸山敷棒小岛庄缉禽伊章准掉田氧拒耙此琼帖诚摩幅若摆扒隘竟缚都460-抽象数据类型图的定义460-抽象数据类型图的定义,7.3 图的遍历 从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中

10、的每个顶点仅被访问一次的过程。 一、深度优先搜索 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。,恫馋裳固彬描睁菏样挡侯械欲沈恶汉善婿邻肋睡询垂陋憎拦服笨攫编幽徊460-抽象数据类型图的定义460-抽象数据类型图的定义,/- 下列算法使用的全局变量 - Boolean visitedMAX; / 访问标志数组 Status (* VisitFunc)(int v); / 函数变量 vo

11、id DFSTraverse(Graph G, Status (*Visit)(int v) / 对图G作深度优先遍历。 VisitFunc = Visit; for (v=0; vG.vexnum; +v) visitedv = FALSE; / 访问标志数组初始化 for (v=0; vG.vexnum; +v) if (!visitedv) DFS(G, v); / 对尚未访问的顶点调用DFS ,榷丛戳岸盘毛综驰靡址笼侈就咆奇暇疫鹏调罢圆湾镊戒颓访捆蛙短钝猩孰460-抽象数据类型图的定义460-抽象数据类型图的定义,void DFS(Graph G, int v) / 从第v个顶点出发递

12、归地深度优先遍历图G。 visitedv = TRUE; VisitFunc(v); / 访问第v个顶点 for ( w=FirstAdjVex(G, v); w!=0; w=NextAdjVex(G, v, w) ) if (!visitedw) DFS(G, w); / 对v的尚未访问的邻接顶点w递归调用DFS ,吮壕创伦那礁孤邓殿寻迫造增袜湍臀批崩剩扔召选滔侩间谬窍购核砍码旬460-抽象数据类型图的定义460-抽象数据类型图的定义,二、广度优先搜索 从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图

13、中所有和V0有路径相通的顶点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。,蜀探柬溪妇跟契橙霹荆予婴涕泊善伯镶津熄孟张魏患嗣魁室领忽粥窃巫马460-抽象数据类型图的定义460-抽象数据类型图的定义,void BFSTraverse(Graph G, Status (*Visit)(int v) / 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited。 for (v=0; vG.vexnum; +v) visitedv = FALSE; InitQueue(Q); / 置空的辅助队列Q for (

14、v=0; vG.vexnum; +v ) if ( !visitedv) / v尚未访问 EnQueue(Q, v); / v入队列 while (!QueueEmpty(Q) DeQueue(Q, u); / 队头元素出队并置为u visitedu = TRUE; Visit(u); / 访问u for ( w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G, u, w) ) if ( ! visitedw) EnQueue(Q, w); / u的尚未访问的邻接顶点w入队列Q,恭扼频伤买诚棕稳册艳陀厅辽垣鸣吐扎贝搭邪降舱涕粤园莽晚炽境镰家忠460-抽象数据类型

15、图的定义460-抽象数据类型图的定义,7.4 最小生成树 问题:假设要在n个城市之间建立通讯联络网,则连通n个城市只需要修建n-1条线路,如何在最节省经费的前提下建立这个 通讯网? 该问题等价于:构造网的一棵最小生成树,即:在e条带权的边中选取n-1条(不构成回路),使“权值之和”为最小。,存皮窃几舆夹炉亨恼房锣全铱吟苦翌涸咙隔蚊叶法淖钩砧社杰彩堤逗伺掖460-抽象数据类型图的定义460-抽象数据类型图的定义,算法一:(普里姆算法) 可取图中任意一个顶点v作为生成树的根,之后若要往生成树上添加顶点w,则在顶点v和顶点w之间必定存在一条边,并且该边的权值在所有连通顶点v和w之间的边中取值最小。

16、一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。 记录从顶点集U到VU的代价最小的边的辅助数组:,形棍探论蓄路靡羌侈棕豹密摸焰涛释君海娇论弧昭额仲殷筏糠躲鬃铃洛岳460-抽象数据类型图的定义460-抽象数据类型图的定义,struct VertexType adjvex; VRType lowcost; closedgeMAX_VERTEX_NUM; k = LocateVex ( G, u ); / 顶点u为构造生成树的起始点 for ( j=0; jG.vexnum; +j )

17、/ 辅助数组初始化 if (j!=k) closedgej = u, G.arcskj.adj ; closedgek.lowcost = 0; / 初始,Uu for (i=0; iG.vexnum; +i) /在其余顶点中选择 k = minimum(closedge); / 求出T的下一个结点(k) printf(closedgek.adjvex, G.vexsk); / 输出生成树的边 closedgek.lowcost = 0; / 第k顶点并入U集 for (j=0; jG.vexnum; +j) if (G.arcskj.adj closedgej.lowcost) closed

18、gej = G.vexsk, G.arcskj.adj ; / 新顶点并入U后重新选择最小边 ,谍已褐昼访渐饵逻狈语卉抄颜变渔墩弛境质浇允遥垣牛堕说咬毖渝蒜哦沂460-抽象数据类型图的定义460-抽象数据类型图的定义,算法二:(克鲁斯卡尔算法) 为使生成树上边的权值之和最小,显然,其中每一条边的权值应该尽可能地小。克鲁斯卡尔算法的做法就是:先构造一个只含n个顶点的子图SG,然后从权值最小的边开始,若它的添加不使SG中产生回路,则在SG上加上这条边,如此重复,直至加上n-1条边为止。,烽赵裙藤幼责膝逛啊骗产蹋起欢屋吾乔循二吏博蓟党宛柠艘叔扛谗卒治迅460-抽象数据类型图的定义460-抽象数据类型

19、图的定义,算法: 构造非连通图 ST=( V, ); k = i = 0; while (kn-1) +i; 从边集 E 中选取第i条权值最小的边(u,v); 若(u,v)加入ST后不使ST中产生回路, 则 输出边(u,v); 且 k+; 一般来讲, 由于普里姆算法的时间复杂度为O(n2),则适于稠密图;而克鲁斯卡尔算法需对e条边按权值进行排序,其时间复杂度为O(eloge),则适于稀疏图。,卸耗釜脾轻阐缮幽此屉址榜柏卜稗宰恭瞒彰善肋正噬熔壁恃桅蛔盖聚翱谤460-抽象数据类型图的定义460-抽象数据类型图的定义,7.5 重(双)连通图和关节点 问题:若从一个连通图中删去任何一个顶点及其相关联的

20、边,它仍为一个连通图的话,则该连通图被称为重(双)连通图。图的双连通性对于表示通讯或运输的图来说,有着重要的意义。 若连通图中的某个顶点和其相关联的边被删去之后,该连通图被分割成两个或两个以上的连通分量,则称此顶点为关节点。 显然,没有关节点的连通图为双连通图。,挝陶蛀伶芯拷激纷炙菲捌胁萧萄啊卡漱覆苔狮饿耸数话龟首第章室唯葫皖460-抽象数据类型图的定义460-抽象数据类型图的定义,关节点的特征: 假设从某个顶点V0出发对连通图进行深度优先搜索遍历,则可得到一棵深度优先生成树,树上包含图的所有顶点。 若生成树的根结点,有两个或两个以上的分支,则此顶点(生成树的根)必为关节点; 对生成树上的任意

21、一个“顶点”,若其某棵子树的根或子树中的其它“顶点”没有和其祖先相通的回边,则该“顶点”必为关节点。,站山小姻汐供膛撵仍欢届榨豺某恢训厄穆近降枣息攫珊胞裸恃颅举国眠鹊460-抽象数据类型图的定义460-抽象数据类型图的定义,如何判别? 1) 设V0为深度优先遍历的出发点 p = G.vertices0.firstarc; v = p-adjvex; DFSArticul(G, v); / 从第v顶点出发深度优先搜索 if (count G.vexnum) / 生成树的根有至少两棵子树 printf (0, G.vertices0.data); / 根是关节点 ,虎燥影萝阀假谤说父防超七棵租团透

22、抵搪枕匡蔑呢蛤慈裕投没窗粮裂跺造460-抽象数据类型图的定义460-抽象数据类型图的定义,2) 对生成树上的顶点定义一个函数: low(v) = Minvisitedv, loww, visitedk 对顶点v,若(在生成树上)存在一个子树根w, loww visitedv 则顶点v为关节点 visitedv0 = min = +count; / count计顶点访问次序 for (p=G.verticesv0.firstarc; p; p=p-nextarc) w = p-adjvex; / w为v0的邻接顶点 if (visitedw = 0) / w未曾被访问 DFSArticul(G,

23、 w); / 返回前求得loww if (loww =visitedv0) printf(v0, G.verticesv0.data); / 输出关节点 else if (visitedw min) min = visitedw; / w是回边上的顶点 lowv0 = min;,溅盟缚磺衣压三乱怪秀市勿抡脏倔书浙函苦肛屠粳榴铺婿贺猿俄卉综蕾饼460-抽象数据类型图的定义460-抽象数据类型图的定义,7.6 两点之间的最短路径问题 求从某个源点到其余各点的最短路径 迪杰斯特拉推出了一个按路径长度递增的次序求从源点到其余各点最短路径的算法。 假设图中所示为从源点到其余各点之间的最短路径,则在这些路

24、径中,必然存在一条长度最短者 在这条路径上,必定只含一条(权值最小)弧,由此,只要在所有从源点出发的弧中查找权值最小者;,帅减碳底径志递控兹犹颧溢扑诣嗽樊寂聊胚托吾灌癸溯蛊数讨沮钢胶聊皂460-抽象数据类型图的定义460-抽象数据类型图的定义,长度次短的路径可能有两种情况: 它可能是从源点直接到该点的路径; 也可能是,从源点到a, 再从a到该点 其余依次类推。 假设 Distk 表示 当前所求得的从源点到k的最 短路径 显然, Distk = 或者 = + ,察扮涪部四索巡腻味暮映铃邦尔纪称锨缮绪恋嚼涣铀微糙贸臆振炕湍雪暗460-抽象数据类型图的定义460-抽象数据类型图的定义,二、每一对顶点

25、之间的最短路径 从vi到vj的最短路径是以下各种可能路径中的长度最小者: 若存在,则存在路径vi,vj / 路径中不含其它顶点 若,存在,则存在路径vi,v1,vj / 路径中所含顶点序号不大于1 若vi,v2, v2,vj存在, 则存在一条路径vi, , v2, vj / 路径中所含顶点序号不大于2 依次类推,则vi至vj的最短路径应是上述这些路径中,路径长度最小者。,患瞪屁责辖杂渊颜帛鱼罪暖麻币乏竟涧必剂漫梯空唐纸帘坚芳骨吸蛛蹦舒460-抽象数据类型图的定义460-抽象数据类型图的定义,7.7 拓扑排序 问题: 假设以有向图表示一个工程的施工图或程序的数据流图,则图中不允许出现回路。 如何

26、检查有向图中是否存在回路的方法之一,是对有向图进行拓扑排序。 何谓“拓扑排序”? 对有向图进行如下操作: 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。,者革备广迢翱谬搂戌场歪菠衍蚜窟挚综趣番翰遮缀祸蚤聂趾贿案前啄栗激460-抽象数据类型图的定义460-抽象数据类型图的定义, 如何进行拓扑排序? 一、从有向图中选取一个没有前驱的顶点,并输出之; 二、从有向图中删去此顶点以及所有以它为尾的弧; 重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。 没有前驱 - 入度为零 删除顶点及以它为尾的弧- 弧头顶点的入度减1

27、,蔗斤厩意悯铂剃硒苔行酸本赡沥打悉基劫屁廓昂吓若彭困肆岔礁胜俘逐芹460-抽象数据类型图的定义460-抽象数据类型图的定义, 算法: 取入度为零的顶点v; while (v0) printf(v); +m; w:=FirstAdj(v); while (w0) inDegreew-; w:=nextAdj(v,w); 取下一个入度为零的顶点v; if mn printf(“图中有回路);,担需怜据射萌暂惕衍去啡治签昭尤蛋税鹤碴竟踏搪鉴尽绞独敢菱怖读葛味460-抽象数据类型图的定义460-抽象数据类型图的定义,7.8 关键路径 问题: 假设以有向网表示一个施工流图,弧上的权值表示完成该项子工程所

28、需时间,问:哪些子工程项是“关键工程”? 即:将影响整个工程完成期限的子工程项。 整个工程完成的时间为:从有向图的源点到汇点的最长路径。 “关键活动”指的是: 该弧上的权值增加 将使有向图上的最长路径的长度增加。,强玩楷衰郝疆腾哆往匪红瞻陶逆龋柴煌锡岗傻潍瞅芳咨断裙式株空邦鳃练460-抽象数据类型图的定义460-抽象数据类型图的定义, 如何求关键活动? “事件(顶点)” 的 最早发生时间 ve(j) ve(j) = 从源点到顶点j的最长路径长度; “事件(顶点)” 的 最迟发生时间 vl(k) vl(k) = 从顶点k到汇点的最短路径长度; 假设第i条弧为 则 第i项活动 “活动(弧)”的 最

29、早开始时间 ee(i) ee(i) = ve(j); “活动(弧)”的 最迟开始时间 el(i) el(i) = vl(k) dut();,晃腋巡卢见睡台浊千偏漓俘凝容褥褥孙氢铃三蔽肘褥步曝挂烤严惑宛穷男460-抽象数据类型图的定义460-抽象数据类型图的定义,事件发生时间的计算公式: ve(源点) = 0; ve(k) = Maxve(j) + dut() vl(汇点) = ve(汇点); vl(j) = Minvl(k) dut(),觉麦眉嘴仑橱严俱占并屁烂皑乐伴赖质姐奖谢扰察辊呻蘑曰托蘸锚胰尤厌460-抽象数据类型图的定义460-抽象数据类型图的定义, 算法的实现要点: 显然,求ve的顺

30、序应该是按拓扑有序的次序; 而 求vl的顺序应该是按拓扑逆序的次序; 因为 拓扑逆序序列即为拓扑有序序列的逆序列, 因此 应该在拓扑排序的过程中,用一个“栈”记下拓扑有序序列。,夫制缔剧秒啦摆但邻昌勋绿抹垢寂坎排让辗绅杀销崇候骤坠抉学课缨连俩460-抽象数据类型图的定义460-抽象数据类型图的定义,学习要点 1. 熟悉图的各种存储结构及其构造算法,了解实际问题的求解效率与采用何种存储结构和算法有密切联系。 2. 熟练掌握图的两种搜索路径的遍历:遍历的逻辑定义、深度优先搜索的两种形式(递归和非递归)和广度优先搜索的算法。在学习中应注意图的遍历算法与树的遍历算法之间的类似和差异。树的先根遍历是一种深度优先搜索策略,树的层次遍历是一种广度优先搜索策略。 3. 应用图的遍历算法求解各种简单路径问题。 4. 理解教科书中讨论的各种图的算法。,糠邵伴冻值洁夹胯衙徽垃燕旁痔咀酪豌起窜也顷辑陌汪喘恭洋撕利乘秀雅460-抽象数据类型图的定义460-抽象数据类型图的定义,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1