《数据结构教学课件第09章.ppt》由会员分享,可在线阅读,更多相关《数据结构教学课件第09章.ppt(115页珍藏版)》请在课桌文档上搜索。
1、第9章 图,图的基本概念图的存储结构图的实现图的遍历最小生成树最短路径拓扑排序 关键路径,主要知识点,自附崩访扩暇邻晴堵贷昆尼蜜庆躬滋张筹默飞源槛乱邹帖塑重绝惨星闻稻数据结构教学课件第09章数据结构教学课件第09章,教学计划编排问题 一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些课程之间有先修和后续的关系,有些课程可以任意安排次序。,醇睛喷梗粪背唾更婶澈懒怕碑吸艰艘楚斜恩饵剔潞暖诽硷务捡娱微芭止倘数据结构教学课件第09章数据结构教学课件第09章,耙存膝袖瞳盆庸恤纸饰组付搐蜡蚤咨证海彼屎饱挡辑倚腑吝堑啦减设赊宣数据结构教学课件第09章数据结构教学课件第09章,教学计划编排问题(图形
2、结构)各课程之间的次序关系可用一个称作图的数据结构来表示,如课程之间优先关系有向图。有向图中的每个顶点表示一门课程,如果从顶点vi到vj之间存在有向边,则表示课程i必须先于课程j进行。,穿序祖蚁善蛮耍喳饿臻娇义醛汰婿赡拱捕健纳基背瓮没纵清胎呻辅辊蹭隋数据结构教学课件第09章数据结构教学课件第09章,课程之间优先关系的有向图,唯桃轴砂垦闷贿汁巧懂荐食藕案污局航拎吸郊鄙讲贫迷传架朴礼姥纵四黎数据结构教学课件第09章数据结构教学课件第09章,9.1 图,1.图的基本概念,图是由顶点集合及顶点间的关系集合组成的一种数据结构。图G的定义是:G=(V,E),其中,V=x|x某个数据元素集合E=(x,y)|
3、x,yV或E=x,y|x,yV并且Path(x,y)其中,(x,y)表示从 x到 y的一条双向通路,即(x,y)是无方向的;Path(x,y)表示从 x到 y的一条单向通路,即Path(x,y)是有方向的。问题:图的特点,饿叠辜沮瞅臭莆删纤递煎颁又汗综冗敝鞭诚柬吴赔烈圾余远硅律尤脆豹墒数据结构教学课件第09章数据结构教学课件第09章,图有许多复杂结构,本课程只讨论最基本的图,因此,本章讨论的图中不包括存在从自身到自身的边的图,以及多条边的图,带自身环的图,多重图,荷摇笼富道于肪幻豢烤文梁蹿梧寇限勃痢驶悯论臭茵棺垫裤叹梭渍羽乖有数据结构教学课件第09章数据结构教学课件第09章,基本术语:,(1)
4、顶点和边:图中的结点一般称作顶点,图中的第i个顶点记做vi。两个顶点vi和vj相关联称作顶点vi和vj之间有一条边,图中的第k条边记做ek,ek=(vi,vj)或vi,vj。,品农一獭盐循辉阑景呸恭甄乐哀枯述妥桔集恬蹦曳抡撬焚娄岸何缄私狠瘸数据结构教学课件第09章数据结构教学课件第09章,(2)有向图和无向图:在有向图中,顶点对x,y是有序的,顶点对x,y称为从顶点x到顶点y的一条有向边,有向图中的边也称作弧;在无向图中,顶点对(x,y)是无序的,顶点对(x,y)称为与顶点x和顶点y相关联的一条边。,轩裤戈状锣神糕获滓与囤孕拣佳缕桥芜烈扼骨筛抢惹悔妙间雾背濒棵绿挺数据结构教学课件第09章数据结
5、构教学课件第09章,(3)完全图:在有n个顶点的无向图中,若有n(n-1)/2条边,即任意两个顶点之间有且只有一条边,则称此图为无向完全图;在有n个顶点的有向图中,若有n(n-1)条边,即任意两个顶点之间有且只有方向相反的两条边,则称此图为有向完全图,无向完全图,不是无向完全图,有向完全图,不是有向完全图,撤吃鸿双纪恩爸增沏稗瞅甥煞煤皿瞻挠姑兼芥荡阑色吠滋翔俩侄拳裕喝壬数据结构教学课件第09章数据结构教学课件第09章,(4)邻接顶点:在无向图G中,若(u,v)是E(G)中的一条边,则称u和v互为邻接顶点,并称边(u,v)依附于顶点u和v;在有向图G中,若u,v是E(G)中的一条边,则称顶点u邻
6、接到顶点v,顶点v邻接自顶点u,并称边u,v和顶点u和顶点v相关联。,拧劳皆秋净捏铝家玻弧潮倘啤纬丫裸驱洼蹄凳欲堪譬瞎信址第铰箕跃吓哎数据结构教学课件第09章数据结构教学课件第09章,(5)顶点的度:顶点v的度是与它相关联的边的条数,记作TD(v)。有向图:顶点的度=入度+出度。入度ID(v)定义为以顶点v为终点的有向边的条数;出度OD(v)定义为以顶点v为起点的有向边的条数;无向图:TD(v)=ID(v)=OD(v),许煌冗新玉传显淹剐渴蕉泣膳俱项市致捐暇十欺净亩擎瞪郴爸讨箍汛极痞数据结构教学课件第09章数据结构教学课件第09章,(6)路径:在图G=(V,E)中,若从顶点vi出发有一组边使可
7、到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到顶点vj的路径.,从顶点0到顶点3的路径?如图G1中:,顶点3,顶点0,顶点2,顶点0,顶点3,纲渡法索讯忆壹缕汹坡兔闷呻耐盟烟步谗朝僻伟岭她贴疑楞糯硷磋掀拼疗数据结构教学课件第09章数据结构教学课件第09章,(7)权:有些图的边附带有数据信息,这些附带的数据信息称为权。带权的图也称作网络或网。,咳手赣嫁蚕侵这剔匙去爆择锥锌景恼庭亢江炭存圣辱郧铂箭瞧竞撵驱汀货数据结构教学课件第09章数据结构教学课件第09章,(8)路径长度:对于不带权的图,一条路径的路径长度是指该路径上的边的条数;对于带权的图,一条路径的路径长度是指该路径上各个边权值
8、的总和。,驻阳忌贱壹战抿沟狡悍已掷爽我沛仟妈仓裕篡辛导楼陷泼士庭蔽承凡孰垃数据结构教学课件第09章数据结构教学课件第09章,(9)子图:设有图G1=V1,E1和图G2=V2,E2,若V1V2,且E1 E2,则称图G2是图G1的子图。,图G2,图G1,田忆嗅唤驾列窟逸浆直彻厩讨们痒帧闸擒阀洋擦豹纫辞稍延卸笔滤胺肤履数据结构教学课件第09章数据结构教学课件第09章,(10)连通图和强连通图:在无向图中,若从顶点vi到顶点vj有路径,则称顶点vi和顶点vj是连通的。如果图中任意一对顶点都是连通的,则称该图是连通 图。在有向图中,若对于任意一对顶点vi和顶点vj(vivj)都存在路径,则称图G是强连通
9、图。,不是强连通图,强连通图,连通图,松泼卜鹿哗存购喜篓霞采枫桩剁藏瞬逸辣宙狡池瑰导赋薯汐床几跪亏层枫数据结构教学课件第09章数据结构教学课件第09章,(11)生成树:一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点和n-1条边。生成树一般是对无向图来讨论。,图G2的生成树,厉迂亿逛湍肝匪氢拯彻兄翅桨摘厩侥酪即磊饯铅惧纂搽烩知萨燥巡横谁纠数据结构教学课件第09章数据结构教学课件第09章,(12)简单路径和回路:若路径上各顶点v1,v2,vm,互不重复,则称这样的路径为简单路径;若路径上第一个顶点v1与最后一个顶点vm重合,则称这样的路径为回路或环。,鳖侈得焕圈舒噶
10、滔喘羞恋瓮赏镜具舅摔睡吻树儡谜函上描窃尖语糙鞭唉做数据结构教学课件第09章数据结构教学课件第09章,数据集合:由一组顶点集合vi和一组边ej集合组成。当为带权图时每条边上权wj还构成权集合wj。操作集合:(1)初始化Initiate(G,n)(2)插入顶点 InsertVertex(G,vertex)(3)插入边InsertEdgeG,v1,v2,weight)(4)删除边DeleteEdge(G,v1,v2)(5)删除顶点DeleteVertex(G,vertex)(6)取第一个邻接顶点GetFirstVex(G,v)(7)取下一个邻接顶点GetNextVex(G,int v1,v2)(8)
11、遍历DepthFirstSearch(G),2.图的抽象数据类型,檀北试外敏红统竿羊拓踌怠雕朝俊月室姚刺样棒采哩瞅勒协寂吁播表仑纪数据结构教学课件第09章数据结构教学课件第09章,9.2 图的存储结构,图的存储结构主要有邻接矩阵和邻接表两种。,1.图的邻接矩阵存储结构,假设图G=(V,E)有n个顶点,即V=v0,v1,vn-1,E可用如下形式的矩阵A描述,对于A中的每一个元素aij,满足:,由于矩阵A中的元素aij表示了顶点vi和顶点vj之间边的关系,或者说,A中的元素aij表示了顶点vi和顶点vj(0jn-1)的邻接关系,所以矩阵A称作邻接矩阵。,尊荡蒋灸标瞥豌痞蔚皖逢焙甥爪粒蒙曝琳阵鸥飞秤
12、朽睹命倍严怀殷泼都闸数据结构教学课件第09章数据结构教学课件第09章,无向图的邻接矩阵一定是对称矩阵,有向图的邻接矩阵一般是非对称矩阵,其中V表示了图的顶点集合,A表示了图的邻接矩阵,画僧湖大讼设诵蔓汹翘趾千几苔及初猫灌薄聪驯帕乙牧临普涛保耪癣户蒲数据结构教学课件第09章数据结构教学课件第09章,对于带权图,邻接矩阵定义为:,冷悔洪造末褥头逢吐蠕纫服钡滴订逢娶债滚尺绥避臃唤茎基溜贼呕匹墒扇数据结构教学课件第09章数据结构教学课件第09章,带权图及其邻接矩阵,其中V表示了图的顶点集合,A表示了图的邻接矩阵。对于带权图,邻接矩阵第i行中所有0aij的元素个数等于第i个顶点的出度,邻接矩阵第j列中所
13、有0aij的元素个数等于第j个顶点的入度。,宇枫讥蓬蝴瘪谜措灶船泄介搐赛饯胺弟庭藏捉乃饰膝例堕错夹熔们腔林枚数据结构教学课件第09章数据结构教学课件第09章,2.图的邻接表存储结构,当图的边数少于顶点个数且顶点个数值较大时,图的邻接nn矩阵的存储问题就变成了稀疏矩阵的存储问题,此时,邻接表就是一种较邻接矩阵更为有效的存储结构。,顶点信息,顶点在数组中的下标,顶点的邻接顶点在数组中下标构成单链表的头指针,侦宛效涂鸯让丘拽溶姓源咱鲍戚颁御稚毗贾丢彪孜臃陛烈熟硒煎荧锈莫浆数据结构教学课件第09章数据结构教学课件第09章,数组的data域存储图的顶点信息;sorce域存储该顶点在数组中的下标序号;ad
14、j域为该顶点的邻接顶点单链表的头指针。第i行单链表中的dest域存储所有起始顶点为vi的邻接顶点vj在数组中的下标序号,next域为单链表中下一个邻接顶点的指针域。如果是带权图,单链表中需再增加cost域,用来存储边的权值wij。,锗腊键违裸努骨碗出肝波发错闯瓮区埋堑羊教乌溅莱奶浚荣羽拆门毕艺箕数据结构教学课件第09章数据结构教学课件第09章,9.3 图的实现,1.邻接矩阵存储结构下图操作的实现,设图G=(V,E),V是顶点集可以用顺序表表示;,E是边集,刻画了顶点之间的关系,用邻接矩阵表示;,边的数量,当做整体,用一个变量表示,结构体变量,先定义相应的结构体,事先确定顶点个数MaxVerti
15、ces,促拭醒值奇趟同洒嫁绣隐臂湘淌叙瘸剂侦怒神才隘第疵维烦椭惮皮屁闲垮数据结构教学课件第09章数据结构教学课件第09章,结构体定义,#include SeqList.h struct SeqList Vertices;int edgeMaxVerticesMaxVertices;int numOfEdges;,一个图G可以用一个AdjMGraph类型的结构体变量或指针来表示。定义语句为:AdjMGraph G,*G1;,typedef,AdjMGraph,笛灯讽坎胞释煮貌陕殊是骆割剐浦舱谆摆落符威逢赃垛排潦砚插财仿求缮数据结构教学课件第09章数据结构教学课件第09章,void Initiat
16、e(AdjMGraph*G,int n)int i,j;ListInitiate(/*边的条数置为0*/,初始化G,对于给定的图G,给定一个AdjMGraph类型的结构体变量或指针。定义语句为:AdjMGraph G;,初始化顺序表成员,初始化顶点关系成员,初始化边数成员,给定一个AdjMGraph类型的结构体变量或指针。定义语句为:AdjMGraph*G;,冤绵殷眺躲粥膏杏视职蹿徒辜脓娘狂捐语吠堰擞滑湍呐寝摔运技颈林捷烤数据结构教学课件第09章数据结构教学课件第09章,void InsertVertex(AdjMGraph*G,DataType vertex)ListInsert(,在给定的
17、图G中插入顶点,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph G;,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph*G;,给定顶点,顶点插入操作,就是对AdjMGraph类型的结构体变量中的成员Vertices插入数据,也就是顺序表的插入操作,G-Vertices.size,吉继淆静探秘劫乞袭抿盗睁霖垄焙激迭雄拨琴幌节皱骤戎喜兑饵镀按牧瞪数据结构教学课件第09章数据结构教学课件第09章,在给定的图G中插入边,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph G;,给定一个AdjMGraph类型的结构体变量
18、或指针。语句为:AdjMGraph*G;,给定边,边插入操作,就是对AdjMGraph类型的结构体变量中的成员edges插入数据,也就是修改二维数组操作,AdjMGraph类型的结构体变量中的成员edges插入数据导致边数的增加,因此还需要修改成员Numofedges的值,给定边两个邻接顶点在顺序表中的位置标号,咨侣嚣襄启寝翱珍摄客铆于蓄锣迸锄决裳嘿诌夕晒昭诛录庆者震骑泣毛吮数据结构教学课件第09章数据结构教学课件第09章,void InsertEdge(AdjMGraph*G,int v1,int v2,int weight)if(_)printf(参数v1或v2越界出错!n);exit(1
19、);G-edgev1v2=weight;G-numOfEdges+;,插入边操作,v1=G-Vertices.size|v2=G-Vertices.size,雄猾松粒湾巳蜜驶臆圭泻搬蛛帐炳愤刻量格耽言泊忠均逗瘩峪居融饿谩足数据结构教学课件第09章数据结构教学课件第09章,void DeleteEdge(AdjMWGraph*G,int v1,int v2)if(v1=G-Vertices.size|v2=G-Vertices.size|v1=v2)printf(参数v1或v2越界出错!n);exit(1);if(_)printf(该边不存在!n);exit(0);G-edgev1v2=MaxW
20、eight;G-numOfEdges-;,删除边操作,G-edgev1v2=MaxWeight|v1=v2,扭保妨病么愿鸽躺痢鸿永嗡出藤谭棚凭束每晤釜踞鲍柬凿挛投掖贺展商几数据结构教学课件第09章数据结构教学课件第09章,int GetFirstVex(AdjMGraph G,int v)int col;if(v G.Vertices.size)printf(参数v1越界出错!n);exit(1);for(col=0;col 0,取第一个邻接顶点,大于0并且小于MaxWeight?,失缩店斋故齐吱例囚听违忱绿术啃风汐胞廊爽温杭失共幅淑慰蜜致逻触啼数据结构教学课件第09章数据结构教学课件第09章
21、,int GetNextVex(AdjMGraph G,int v1,int v2)int col;if(v1=G.Vertices.size|v2=G.Vertices.size)printf(参数v1或v2越界出错!n);exit(1);for(col=v2+1;col 0,大于0并且小于MaxWeight?,取下一个邻接顶点,红醉菜票纷盖响誓刮趟咽姿善爪郑板梢彬衬村课疟揣邪栓淋胶宇幸灌孪副数据结构教学课件第09章数据结构教学课件第09章,2.邻接矩阵图操作的测试,例9-1 以下图所示的带权有向图为例编写测试邻接矩阵图的程序。,边的权值,边的起点,边的终点,顶点存储在一个字符数组中,边信息
22、存储在一个结构数组中,俏魏戊捡峻猜屿菊祁爵敲烂实痹凳霍耗芹徽吏献豪敢闸多篡纯堑城仍午眺数据结构教学课件第09章数据结构教学课件第09章,图的创建函数设计如下:边信息结构体定义typedef struct int row;/行下标 int col;/列下标 int weight;/权值 RowColWeight;,创建该图,对一个AdjMGraph类型的结构变量插入顶点和边,瘫逞告孩牢础厂董虎刻睫矽吓鹏振担伊趣寥腥括奋缸储合虹靖铅喇晚访持数据结构教学课件第09章数据结构教学课件第09章,void CreatGraph(AdjMGraph*G,DataType V,int n,RowColWeig
23、ht E,int e)/*在图G中插入n个顶点信息V和e条边信息E*/int i,k;Initiate(G,n);/*初始化n个顶点的图*/for(i=0;i n;i+)InsertVertex(G,Vi);/*顶点插入*/for(k=0;k e;k+)InsertEdge(G,Ek.row,Ek.col,Ek.weight);/*边插入*/,图的创建函数,图存放的AdjMGraph类型的指针变量,顶点和顶点数,边信息和边数,鲸电卢笋伏惫颅痛阂墒悄授卧杉塔功败画撩骗锨排妇群姥胚誊坐酪遵门冻数据结构教学课件第09章数据结构教学课件第09章,测试程序设计如下:#include#include ty
24、pedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxEdges 100#define MaxWeight 10000#include AdjMGraph.h#include AdjMGraphCreate.h,void main(void)AdjMWGraph g1;DataType a=A,B,C,D,E;RowColWeight rcw=0,1,10,0,4,20,1,3,30,2,1,40,3,2,50;int n=5,e=5;int i,j;CreatGraph(,妄猴屹熙盅杀鸭浪章颖抡矫山迢哭
25、汕沽啥查漓洼舜阻惮匆汁凝筒婶氛域木数据结构教学课件第09章数据结构教学课件第09章,2.邻接表存储结构下图操作的实现,三个成员:data,source,单链表头指针adj,两个成员:下标dest,下一个结点指针next,曳瘴时勘诈领噎筐顿向萄怨翘潜球泽的界疫满店非霹夹牧兰耻嚷洁硬堑千数据结构教学课件第09章数据结构教学课件第09章,2.邻接表存储结构下图操作的实现,邻接表的存储结构typedef struct Nodeint dest;/*邻接边的弧头顶点序号*/struct Node*next;Edge;/*邻接边单链表的结点结构体*/typedef structDataType data;
26、/*顶点数据元素*/int sorce;/*邻接边的弧尾顶点序号*/Edge*adj;/*邻接边的头指针*/AdjLHeight;/*数组的数据元素类型结构体*/,墩饰宪滋碉枉枷剔胆矢萝行吸啦匣决番过活腆诀斗俞别侄毙评仍委填闺恬数据结构教学课件第09章数据结构教学课件第09章,typedef struct AdjLHeight aMaxVertices;/*邻接表数组*/int numOfVerts;/*顶点个数*/int numOfEdges;/*边个数*/AdjLGraph;/*邻接表结构体*/讨论:图操作的实现方法,一个邻接表用一个AdjLGragph类型的指针变量表示,定义语句为:Ad
27、jLGraph*G;,妙统轰究倦釉轮权照冈柜抉拟弓呆勺附唯逐歉忆甸搂巢泡舆瓢熔麦苏梅肝数据结构教学课件第09章数据结构教学课件第09章,0,1,2,i,MaxVertices,3.插入第i个顶点,i?,AdjLGraph*G,ai,data,到桨幸穿贮诵特渴趣翘褒哎水醛叮诬霓莎亡竣烹速毛芋梅账淑炉蓟眠裕争数据结构教学课件第09章数据结构教学课件第09章,0,1,2,v1,MaxVertices,4.插入边,v1,v2是否在numOfVerts范围内?,已知顶点v1和v2,adj,p,v2,修改边数,弗哀指蹄收盏磺谱瑰撒辰昼吠咽龄诚谚可搭斩欧烯懈阴条莱溃吟掣油篮葫数据结构教学课件第09章数据结构
28、教学课件第09章,0,1,2,v1,MaxVertices,5.删除边,v1,v2是否在numOfVerts范围内?,已知顶点v1和v2,adj,查找v2?,curr,只要curr存在且其dest值!=v2则curr下移一个,一般需要记录curr的前一个,引入pre,curr,pre,找完,分为三种情况.在第一个.不是第一个.其他,率居碍氯夏筐捏狰腮逃祸差蕴抉账压嘴赡永迂痢骏散来见宜棋收驹烧羡昧数据结构教学课件第09章数据结构教学课件第09章,0,1,2,v,MaxVertices,6.取第一个邻接顶点,v是否在numOfVerts范围内?,已知顶点v,adj,努疫拐被铂椿模鄂帛琵悄谈阀袄叹许
29、钮靡垫骤宰咳饶崩垮蜜诚伪累帽赔晴数据结构教学课件第09章数据结构教学课件第09章,邻接表存储结构下的图的定义和操作测试参见具体程序:GraphTest.c,冀翁泡涂烽病缀软班贮谐踏豢匆洪傅败纯茸绣装谰羚翻总扼挖斋其反诺踩数据结构教学课件第09章数据结构教学课件第09章,9.4 图的遍历,1.图的深度和广度优先遍历算法,图的遍历是访问图中的每一个顶点且每个顶点只被访问一次.图遍历方法深度优先遍历广度优先遍历算法设计需要考虑三个问题:算法的参数要指定访问的第一个顶点;要考虑遍历路径可能出现的死循环问题;要使一个顶点的所有邻接顶点按照某种次序被访问。,硼奥都飞叶宗吻扔迭咆攘闷刷熙镭烽逮巫皖帚缅靶燃桨
30、摧仓送写沮石呕焙数据结构教学课件第09章数据结构教学课件第09章,一、图的深度优先遍历算法,图的深度优先遍历算法是遍历时深度优先的算法;图的深度优先遍历是指在图的所有邻接顶点中,每次都在访问 完当前顶点之后,接着首先访问当前顶点的第一个邻接顶点。图的深度优先遍历算法是一个函数递归调用算法。,钡砰散峡邦呆近吻首翔嫩齿分腑俄冻随虑沃弄溢乞绝移压名煤腿吊千修恫数据结构教学课件第09章数据结构教学课件第09章,开始,选择初始顶点v,0,取v的第一个邻接顶点w,w访问?,取v的邻接顶点w的下一个邻接顶点w,结束,0,w存在否,按深度优先遍历访问w,1,访问和标记v已访问,连通图的深度优先遍历算法为:,树
31、焚拿诗册娱驳还祟货匠巳驻厚咨淮敲飞秃油让造奎诀瓤君竟烟归韧畴地数据结构教学课件第09章数据结构教学课件第09章,对于例9-8所示的有向图,顶点A作为初始访问结点,深度优先遍历访问顶点次序为:A B D C E,同一个路径顶点优先,酷封榜纳疹稽霍雹肆馆辰芽腻耕是宽咕棱限澡轩庇煮读唾乡盼末疡都烧我数据结构教学课件第09章数据结构教学课件第09章,二、图的广度优先遍历算法,图的广度优先遍历算法是一个分层搜索的过程,需要一个队列以保持访问过的顶点的顺序,以便按访问过的顶点的顺序来访问这些顶点的邻接顶点。连通图的广度优先遍历算法为:,图的广度优先遍历是指从指定的顶点开始,按照到该顶点 路径长度由短到长的
32、顺序,依次访问图中的其余顶点。,廖妄昧袱料旬壕据乞功邵虹芯银泌垂兑诚党遗挎讥擅岩囊碗间宇庚栋没骑数据结构教学课件第09章数据结构教学课件第09章,开始,选择初始顶点v,顶点入队列Q,Q的队头元素u出队,Q空否,0,寻找u的第一个邻接顶点w,w访问?,取u的邻接顶点w的下一个邻接顶点w,1,结束,0,w存在否,访问和标记w已访问,0,1,访问和标记v已访问,孔皱蛤拿梆属嫉词每聋涌账珊化扳营吠师开驾奥衔薄凝渝税邑乍室代橇浇数据结构教学课件第09章数据结构教学课件第09章,对于例9-8所示的有向图,顶点A作为初始访问结点,广度优先遍历访问顶点次序为:A B E D C问题:图的(深度、广度)遍历和生
33、成树的关系?,同一个顶点的邻接顶点优先,罩损匹材瓣找攀寇渭患板官馁莉奥侧拔磐歼溜司掸嗜糯低坊拨坏姜见刹具数据结构教学课件第09章数据结构教学课件第09章,三、非连通图的遍历,对于非连通图,从图的任意一个顶点开始深度或广度优先遍历并不能访问图中的所有顶点。只能访问和初始顶点连通的所有顶点。但是,每一个顶点都作为一次初始顶点进行深度优先遍历或广度优先遍历,并根据顶点的访问标记来判断是否需要访问该顶点,就一定可以访问非连通图中的所有顶点。,毯磨憎吉宜肉前摘泊鸵蛾鳃房荡酵废胀九游淮旦累临砂兜由琉涅手易汐纹数据结构教学课件第09章数据结构教学课件第09章,void DepthFSearch(AdjMWG
34、raph G,int v,int visited,void Visit(DataType item)int w;Visit(G.Vertices.listv);visitedv=1;w=GetFirstVex(G,v);while(w!=-1)if(!visitedw)DepthFSearch(G,w,visited,Visit);w=GetNextVex(G,v,w);,2.图的深度和广度优先遍历函数实现,一、连通图深度优先遍历,含潍姓缸杂咖君呢它箔崎豹秩涂射坤舰揪岩矩熬啮率凄埠屿槽盐侈蹬洋殖数据结构教学课件第09章数据结构教学课件第09章,二、非连通图的深度优先遍历,void DepthF
35、irstSearch(AdjMWGraph G,void Visit(DataType item)int i;int*visited=(int*)malloc(sizeof(int)*G.Vertices.size);for(i=0;i G.Vertices.size;i+)visitedi=0;for(i=0;i G.Vertices.size;i+)if(!visitedi)DepthFSearch(G,i,visited,Visit);free(visited);,思想:对图中每一个顶点作为初始顶点进行深度优先遍历,为了避免访问过的顶点重新被访问,引入标记指针,对图中顶点进行循环,戳吐瘸
36、伟忍垂弓梢谣郝雄奏肤共葵维究蝎檀豺腻坟弥国摆抨蓉肯尽跺种无数据结构教学课件第09章数据结构教学课件第09章,三、连通图的广度优先遍历,#include SeqQueue.hvoid BroadFSearch(AdjMWGraph G,int v,int visited,void Visit(DataType item)DataType u,w;SeqCQueue queue;Visit(G.Vertices.listv);visitedv=1;QueueInitiate(,烃喻揭休酌穴疗岗始蛾傈拈志豌笨扎忠有司任硝隙渭颤险尺俐规矛症汐绒数据结构教学课件第09章数据结构教学课件第09章,void
37、 BroadFirstSearch(AdjMWGraph G,void Visit(DataType item)int i;int*visited=(int*)malloc(sizeof(int)*G.Vertices.size);for(i=0;i G.Vertices.size;i+)visitedi=0;for(i=0;i G.Vertices.size;i+)if(!visitedi)BroadFSearch(G,i,visited,Visit);free(visited);,四、非连通图的广度优先遍历,迈钓匿绽枢紫坊斑宏晕垢披划霸劫锑籍务动搂孺揍般拼唇巍番蓝桨饶膛拽数据结构教学课件第
38、09章数据结构教学课件第09章,五、程序举例例9-2 以图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。#include#include#include typedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxEdges 100,纸袱寞锚金倚侯重庆沥雁貌鸵摹浓径硒豌靡塌修寺乎盅福硝助购肖件上聘数据结构教学课件第09章数据结构教学课件第09章,#define MaxWeight 10000#define MaxQueueSize 100#include AdjMGraph.
39、h#include AdjMGraphCreate.h#include AdjMGraphTraverse.hvoid Visit(DataType item)printf(%c,item);,螺慰撤厂次共爆诊掐涎煌混送铀羔季成于递咙斟翁胎光赐吝踏筑菌少据焉数据结构教学课件第09章数据结构教学课件第09章,void main(void)AdjMWGraph g1;DataType a=A,B,C,D,E;RowColWeight rcw=0,1,10,0,4,20,1,3,30,2,1,40,3,2,50;int n=5,e=5;CreatGraph(,扶迟咕琐祈侵添侈共芥狠去卖翰帮燃永混周蚂
40、弦呆缕辉狱景华吩互盗残愉数据结构教学课件第09章数据结构教学课件第09章,9.5 最小生成树,1.基本概念,一个有n个顶点的连通图的生成树是原图的极小连通子图,它包含原图中的所有n个顶点,并且有保持图连通的最少的边。,(1)若在生成树中删除一条边就会使该生成树因变成非连通图而不再满足生成树的定义;(2)若在生成树中增加一条边就会使该生成树中因存在回路而不再满足生成树的定义;(3)一个连通图的生成树可能有许多;(4)有n个顶点的无向连通图,无论它的生成树的形状如何,一定有且只有n-1条边。,附嗣藕藤驮皱佩千倾激率族跺啮墨图善水眺百鸿羚妒爸力温否硅槛胳坞弛数据结构教学课件第09章数据结构教学课件第
41、09章,无向图和它的不同的生成树,羞喘彼距算毋胺蠕贴率灸抽而殃檀淹暑瘴襟宁栓释秤唯嘉愁睫喝评撰茸滞数据结构教学课件第09章数据结构教学课件第09章,如果无向连通图是一个带权图,那么它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小代价生成树,简称最小生成树。,构造有n个顶点的无向连通带权图的最小生成树必须满足以下三条:(1)构造的最小生成树必须包括n个顶点;(2)构造的最小生成树中有且只有n-1条边;(3)构造的最小生成树中不存在回路。,典型的构造方法有两种,一种称作普里姆(Prim)算法,另一种称作克鲁斯卡尔(Kruskal)算法。,壹北画筐捞突疼粟惰梅础怠埔轧忧揩床褥
42、米媳撤莉渣贴誓振翠掘丹辱概帧数据结构教学课件第09章数据结构教学课件第09章,2.普里姆算法,一、算法思想,假设G=(V,E)为一个带权图,V为带权图中顶点的集合,E为带权图中边的权值集合。设置两个新的集合U和T,U用于存放带权图G的最小生成树的顶点的集合,T用于存放带权图G的最小生成树的权值的集合。,耻堆绑簇志刁呛迟悬窖乱捌焰侍祝帚黄虾胁臻郝与峭后政斩笔浦设嘶罐鳃数据结构教学课件第09章数据结构教学课件第09章,普里姆算法思想是:(1)令集合U的初值为U=u0,集合T的初值为T=。(2)从所有顶点uU和顶点vV-U的带权边中选出具有最小权 值的边(u,v),将顶点v加入集合U中,将边(u,v
43、)加入集合T中。(3)判断U=V是否成立 不成立重复(2)成立时,最小生成树构造完毕。,假设构造最小生成树时从顶点u0开始,结论:最终集合U中存放着最小生成树顶点的集合,集合T中存放着最小生成树边的权值集合。,饺浅庙羡仓邯傻忻玛凝虫署训丧妮刨往涟缨楷缚吠匪涨站兴弟亿捂交剁辞数据结构教学课件第09章数据结构教学课件第09章,图9-10 普里姆算法构造最小生成树的过程,U=A,V-U=B,C,D,E,F,G,T=50,U=A,B,V-U=C,D,E,F,G,更新,T=50,40,U=A,B,E,V-U=C,D,F,G,更新,T=50,40,50,T=,40,50,50,U=A,B,E,D,V-U=
44、C,F,G,更新,T=50,40,50,30,30,U=A,B,E,D,F,V-U=C,G,更新,T=50,40,50,30,42,42,U=A,B,E,D,F,G,V-U=C,更新,T=50,40,50,30,42,45,45,U=A,B,E,D,F,G,C,V-U=,更新,鞭俱无闷科翔瞥势欢巢雪陋拆拉酞炙搁劣扯杉亚叉耀闭锄佐束迄饭渗孤始数据结构教学课件第09章数据结构教学课件第09章,U=A,V-U=B,C,D,E,F,G,T=,初始状态:,0,1,2,4,6,3,5,最小生成树,A,第1步:在U和V-U的顶点之间选择权值 最小的边对应的顶点。,0,60,50,B,50,U=A,B,V-U
45、=C,D,E,F,G,更新,T=50,-1,量脐苇鸡庆救卞果橡碴储虾沸绢卿蓖丸挥乒喧渗今漂铀班灯货飞呕欠舷买数据结构教学课件第09章数据结构教学课件第09章,0,1,2,4,6,3,5,最小生成树,A,第2步:在U和V-U的顶点之间选择权值 最小的边对应的顶点。,-1,60,50,B,50,U=A,B,V-U=C,D,E,F,G,第1步更新后,T=50,-1,预处理:引入一个一维数组lowcost。,lowcost,lowcost初值为第1行权值,第1个改为-1,在第1步更新后对Lowcost进行更新,对更新的顶点对应的邻接矩阵中的行元素 从第1元素开始与lowcost中的元素进行比较,用小的
46、替换lowcost中的值,65,40,E,40,误撕零酪鲍当戍胎弱绪寝佛球昂收董峦瘁萝熬嘿静威呜怯审嗽华甜酥坍椅数据结构教学课件第09章数据结构教学课件第09章,二、普里姆函数设计,普里姆函数应有两个参数,一个参数是图G,另一个参数是通过函数得到的最小生成树的顶点数据和相应顶点的边的权值数据closeVertex。其数据类型定义为如下结构体:typeder struct VerT vertex;int weight;MinSpanTree;其中,vertex域用来保存最小生成树每条边的弧头顶点数据,weight域用来保存最小生成树的相应边的权值。,图G,图G的最小生成树可以用MinSpanTr
47、ee类型的结构数组和结构指针变量表示,普里姆算法可以用一个函数来实现,闸坛癣驱游庶箕池辞谁占流服棕账痊腕规恢沃洲壮泳秀惟禄铃妻齐梆柄鄙数据结构教学课件第09章数据结构教学课件第09章,普里姆函数设计:void Prim(AdjMWGraph G,MinSpanTree closeVertex)VerT x;int n=G.Vertices.size,minCost;int*lowCost=(int*)malloc(sizeof(int)*n);int i,j,k;for(i=1;i n;i+)lowCosti=G.edge0i;/*从顶点0出发构造最小生成树*/ListGet(G.Vertic
48、es,0,i+),佑股吐加尸逗欢斌坊荫捉剩钾断砌拧日铰衬制霄瓤苹纠苇社潮猎掖疮奉卒数据结构教学课件第09章数据结构教学课件第09章,/*寻找当前最小权值的边所对应的弧头顶点k*/minCost=MaxWeight;for(j=1;j 0)minCost=lowCostj;k=j;ListGet(G.Vertices,k,前涉脏项纪敞塘陇诡腿宏账搓皿红跟镇团哨哩筋临陈倚艇悦痴渺钩痊扶叛数据结构教学课件第09章数据结构教学课件第09章,设计说明:(1)函数中定义一个临时数组lowCost,数组元素lowCostv中保存了集合U中顶点ui与集合V-U中顶点vj的所有边中当前具有最小权值的边(u,v)
49、。(2)集合U的初值为U=序号为0的顶点。lowCost的初始值为邻接矩阵数组中第0行的值,这样初始时lowCost中就存放了从集合U中顶点0到集合V-U中各个顶点的权值。(3)每次从lowCost中寻找具有最小权值的边,根据lowCost的定义,这样的边其弧头顶点必然为集合U中的顶点,其弧尾顶点必然为集合V-U中的顶点。当选到一条这样的边(u,v),就保存其顶点数据和权值数据到参数closeVertex中,并将lowCostv置为-1,表示顶点v加入了集合U中。,含碉醛扣哭呈娇剧政党羽夷盔凳准陨击近涪虞思浊忙瞒羊凡温壬洪箩怔扫数据结构教学课件第09章数据结构教学课件第09章,(4)当顶点v从
50、集合V-U加入到集合U后,若存在一条边(u,v),u是集合U的顶点,v是集合V-U的顶点,且边(u,v)较原先lowCostv的代价更小,则用这样的权值修改原先lowCostv中的相应权值。(5)以图9-10(a)所示的无向连通带权图为例,调用普里姆函数时数组lowCost的动态变化过程如图示。,屋度茁碰诚呢疑涌露乾翠树荐淌拼体术祟婴仗郊澈绚祁噎搞拘证椎穿湿锦数据结构教学课件第09章数据结构教学课件第09章,函数主要是一个两重循环,其中每一重循环的次数均为顶点个数n,所以该算法的时间复杂度为O(n2)。,三、测试程序例9-3 以图9-10(a)所示的无向连通带权图为例设计测试上述Prim函数的