数据结构(C语言描述)第7章-图07课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构(C语言描述)第7章-图07课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 描述 07 课件
- 资源描述:
-
1、第第7 7章章 图图q 理解图的基本概念及有关术语,掌握图的两种存储结构理解图的基本概念及有关术语,掌握图的两种存储结构(邻接矩阵和邻接表邻接矩阵和邻接表)的表示方法;的表示方法;q 熟练掌握图的两种遍历熟练掌握图的两种遍历(深度优先搜索遍历和广度优先搜深度优先搜索遍历和广度优先搜索遍历索遍历)的算法思想、设计步骤,并能列出按上述两种遍历的算法思想、设计步骤,并能列出按上述两种遍历算法得到的序列;算法得到的序列;q 理解最小生成树的概念,能按理解最小生成树的概念,能按Prim构造最小生成树;构造最小生成树;q 领会求最短路径、拓扑排序以及关键路径的算法思想。领会求最短路径、拓扑排序以及关键路径
2、的算法思想。学习要点学习要点7.1 图的基本概念图的基本概念 图是由图是由一个一个顶点集顶点集 V和和一个描述顶点之间关系一个描述顶点之间关系(边或者弧)的集合(边或者弧)的集合R构成的数据结构。构成的数据结构。Graph=(V,VR)其中,其中,VR|v,wV 且且 P(v,w)表示从表示从 v 到到 w 的一条弧,并称的一条弧,并称 v 为为弧尾弧尾或或初始点,初始点,w 为为弧头弧头或终端点。或终端点。谓词谓词 P(v,w)定义了弧定义了弧 的意义或信息。的意义或信息。v 图的定义图的定义&图的应用举例图的应用举例例例1 交通图(公路、铁路)交通图(公路、铁路)顶点:地点顶点:地点 边:
3、连接地点的公路边:连接地点的公路例例2 电路图电路图 顶点:元件顶点:元件 边:连接元件之间的线路边:连接元件之间的线路例例3 各种流程图各种流程图 如产品的生产流程图如产品的生产流程图 顶点:工序顶点:工序 边:各道工序之间的顺序关系边:各道工序之间的顺序关系 V0V0V4V4 V3V3V1V1V2V2 V0V0V2V2 V3V3V1V17.1.2 图的术语图的术语 V0V0V4V4 V3V3V1V1V2V2 V0V0V2V2 V3V3V1V1&有向图和无向图有向图和无向图&顶点、边、弧、弧头、弧尾顶点、边、弧、弧头、弧尾V VW WV VW W3 31 12 23 31 12 2&完全图、
4、稠密图、稀疏图完全图、稠密图、稀疏图7 71 12 26 65 54 43 35 52 23 36 64 41 1&度、入度、出度度、入度、出度&边的权、网边的权、网 1 12 25 54 43 3176324 58B BC CA A21435&路径、路径长度路径、路径长度 V0V0V4V4 V3V3V1V1V2V2V0V0V1V1&回路、简单路径、简单回路回路、简单路径、简单回路 V0V0V4V4 V3V3V1V1V2V2 V0V0V2V2 V3V3V1V1&子图子图 V0V0V4V4 V3V3V1V1V2V2 V0V0V4V4 V3V3V1V1V2V2 V0V0 V3V3V1V1&连通图、
5、连通分量连通图、连通分量 V0V0 V4V4 V3V3 V1V1 V2V2 V0V0 V2V2 V3V3 V1V1 V5V5 V4V4&强连通图、强连通分量强连通图、强连通分量 V0V0 V1V1 V2V2 V3V3 V0V0 V1V1 V2V2 V3V3 V1V1 V0V0 V2V2 V3V3&生成树、生成森林生成树、生成森林 V0V0 V4V4 V3V3 V1V1 V2V2 V0V0 V4V4 V3V3 V1V1 V2V2 V0V0 V4V4 V3V3 V1V1 V2V2图是一种结构复杂的数据结构,表现在不仅各个顶图是一种结构复杂的数据结构,表现在不仅各个顶点的度可以千差万别,而且顶点之间
6、的逻辑关系也错点的度可以千差万别,而且顶点之间的逻辑关系也错综复杂。从图的定义可知,一个图的信息包括两部分,综复杂。从图的定义可知,一个图的信息包括两部分,即即图中顶点的信息图中顶点的信息以及以及描述顶点之间的关系(边或者描述顶点之间的关系(边或者弧)的信息弧)的信息。因此无论采用什么方法建立图的存储结。因此无论采用什么方法建立图的存储结构,都要完整、准确地反映这两方面的信息。构,都要完整、准确地反映这两方面的信息。图通常有图通常有邻接矩阵、邻接表、邻接多重表和十字链邻接矩阵、邻接表、邻接多重表和十字链表表等表示方法。等表示方法。7.2 图的存储结构图的存储结构 7.2.1 邻接矩阵邻接矩阵
7、定义定义:在邻接矩阵表示中,除了用一维数组存放:在邻接矩阵表示中,除了用一维数组存放顶点本身信息外,还用一个矩阵表示各个顶点之间顶点本身信息外,还用一个矩阵表示各个顶点之间的邻接关系。这个矩阵称为的邻接关系。这个矩阵称为邻接矩阵邻接矩阵。假设图假设图G(V,E)有有n个确定的顶点,即个确定的顶点,即Vv0,v1,vn-1,则表示,则表示G中各顶点相邻关系为一个中各顶点相邻关系为一个nn的矩阵,矩阵的元素为的矩阵,矩阵的元素为:Aij=1 若若(vi,vj)或或是是E(G)中的边中的边 0 若若(vi,vj)或或不是不是E(G)中的边中的边 V0V1V2V3 0 01 11 10 00 00 0
8、0 00 00 00 00 01 11 10 00 00 0A=例例 V0V4V3V1V20 01 10 01 10 01 10 01 10 01 10 01 10 01 11 11 10 01 10 00 00 01 11 10 00 0B=&邻接矩阵邻接矩阵 V0V2V1V3V485679343 36 65 53 34 4 6 64 48 89 95 58 87 7 9 97 7C=&邻接矩阵邻接矩阵 从无向图的邻接矩阵可以得出如下结论:从无向图的邻接矩阵可以得出如下结论:矩阵是对称的;矩阵是对称的;第第i行或第行或第i 列列1的个数为顶点的个数为顶点i 的度;的度;矩阵中矩阵中1的个数的
9、一半为图中边的数目;的个数的一半为图中边的数目;很容易判断顶点很容易判断顶点i和顶点和顶点j之间是否有边相连之间是否有边相连(看看矩阵中矩阵中i行行j列值是否为列值是否为1)。&邻接矩阵邻接矩阵 从有向图的邻接矩阵可以得出如下结论:从有向图的邻接矩阵可以得出如下结论:矩阵不一定是对称的;矩阵不一定是对称的;第第i 行中行中1的个数为顶点的个数为顶点i 的出度;的出度;第第i列中列中1的个数为顶点的个数为顶点 i的入度;的入度;矩阵中矩阵中1的个数为图中弧的数目;的个数为图中弧的数目;很容易判断顶点很容易判断顶点i和顶点和顶点j是否有弧相连。是否有弧相连。&邻接矩阵邻接矩阵 图的邻接矩阵数据类型
10、描述:图的邻接矩阵数据类型描述:在用邻接矩阵存储图时,除了用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需用一个一维数组来存储顶点信息,另外还有图的顶点数和边数。故可将其形式描述如下:#define INFINITY 1000#define MAX_VERTEX_NUM 20&邻接矩阵邻接矩阵 7.2.2 邻接表邻接表 邻接表是图的一种顺序存储与链式存储结合的存邻接表是图的一种顺序存储与链式存储结合的存储方法。邻接表表示法类似于树的孩子链表表示法。储方法。邻接表表示法类似于树的孩子链表表示法。就是对于图就是对于图G中的每个顶点中的每个顶点vi,将所有邻接于,将所有邻接于vi的顶点链成
11、一个单链表,这个单链表就称为顶点的顶点链成一个单链表,这个单链表就称为顶点vi的邻接表,再将所有的邻接表表头放到数组中,就的邻接表,再将所有的邻接表表头放到数组中,就构成了图的邻接表。其中,单链表中的结点称为表构成了图的邻接表。其中,单链表中的结点称为表结点,每个单链表设的一个头结点称为顶点结点。结点,每个单链表设的一个头结点称为顶点结点。对图中每个顶点对图中每个顶点Vi建立一个单链表,链表中的结点表建立一个单链表,链表中的结点表示依附于顶点示依附于顶点Vi的边,每个链表结点为两个域:的边,每个链表结点为两个域:每个链表附设一个头结点,头结点结构为:每个链表附设一个头结点,头结点结构为:其中:
12、顶点域其中:顶点域data存放顶点信息存放顶点信息;表头指针表头指针firstarc指向链表的第一个结点。指向链表的第一个结点。顶点域顶点域表头指针表头指针datafirstarc邻接点域邻接点域指针域指针域adjvexnextarc&无向图的邻接表无向图的邻接表顶点顶点:通常按编号顺序将顶点数据存储在一维数组中;:通常按编号顺序将顶点数据存储在一维数组中;与同一顶点关联的边与同一顶点关联的边:用线性链表存储:用线性链表存储特点特点:设无向图中顶点数为:设无向图中顶点数为n,边数为,边数为e,则它的邻接表需要则它的邻接表需要n个头结点和个头结点和2e个表结点。个表结点。顶点顶点Vi的度的度 T
13、D(Vi)=链表链表i中的表结点数。中的表结点数。V0V4V3V1V20V01V12V23V34V42 21 13 34 42 22 21 11 10 00 03 34 4下标下标 编号编号 linklink返回用链表存储用链表存储同一顶点为同一顶点为起点起点的弧的弧&有向图邻接表有向图邻接表 V0 V1 V2 V30V01V1 2V23V31 12 23 30 0用链表存储用链表存储同一顶点为同一顶点为起点起点的弧的弧&有向图的逆邻接表有向图的逆邻接表 V0 V1 V2 V30V01V1 2V23V33 30 00 02 2&结论结论&结论结论7.2.3 十字链表十字链表 十字链表是将十字链
14、表是将有向图有向图的邻接表和逆邻接表结合起的邻接表和逆邻接表结合起来的一种有向图来的一种有向图链式链式存储结构。存储结构。结点结构结点结构 有向图的每一条弧有一个弧结点,每一个顶点必有向图的每一条弧有一个弧结点,每一个顶点必有一个顶点结点,其结构为:有一个顶点结点,其结构为:弧结点弧结点顶点结点顶点结点tailvexheadvexinfohlinktlinkdatafirstinfirstout建立有向图的十字链表:建立有向图的十字链表:7.2.4 邻接多重表邻接多重表 邻接多重表是无向图的另一种链式存储结构。邻接多重表是无向图的另一种链式存储结构。每一个顶点有一个顶点结点,顶点结点结构为:每
15、一个顶点有一个顶点结点,顶点结点结构为:图的每一条边有一个边结点,边结点的结构为:图的每一条边有一个边结点,边结点的结构为:datafirstedgeivex ilink jvex jlinkmark图的邻接多重表数据类型描述:图的邻接多重表数据类型描述:#define MAX_VERTEX_NUM 20typedef emnu unvisited,visited VisitIf;typedef struct EBoxVisitIf mark;int ivex,jvex;struct EBox ilink,jlink;EBox;typedef struct VexBoxVertexType d
16、ata;EBox fistedge;VexBox;typedef structVexBox adjmulistMAX_VERTEX_NUM;int vexnum,edgenum;AMLGraph;7.3 图的遍历图的遍历 和树的遍历类似,图的遍历也是从某个顶点出发,和树的遍历类似,图的遍历也是从某个顶点出发,沿着某条搜索路径对图中所有顶点各作一次访问。沿着某条搜索路径对图中所有顶点各作一次访问。图访问的四个难点:图访问的四个难点:首结点首结点、非连通图、非连通图、回路、多个相连顶点、回路、多个相连顶点我们可以设置一个全局型标志数组我们可以设置一个全局型标志数组visited来标志来标志某个顶点
17、是否被访过,未访问的值为某个顶点是否被访过,未访问的值为0,访问过的,访问过的值为值为1。根据搜索路径的方向不同,图的遍历有两种方法:根据搜索路径的方向不同,图的遍历有两种方法:深度优先搜索和广度优先搜索。深度优先搜索和广度优先搜索。深度优先搜索遍历类似于树的先序遍历。假定给定图深度优先搜索遍历类似于树的先序遍历。假定给定图G的的初态是所有顶点均未被访问过,在初态是所有顶点均未被访问过,在G中任选一个顶点中任选一个顶点v作为遍作为遍历的初始点,则深度优先搜索遍历可定义如下:历的初始点,则深度优先搜索遍历可定义如下:7.3.1 深度优先搜索深度优先搜索1)首先访问顶点首先访问顶点v,并将其访问标
18、记置为访问过,即,并将其访问标记置为访问过,即visitedv=TRUE;2)然后搜索与顶点然后搜索与顶点v有边相连的下一个顶点有边相连的下一个顶点w,若,若w未被访问未被访问过,则访问它,并将过,则访问它,并将w的访问标记置为访问过,然后从的访问标记置为访问过,然后从w开始重复此过程;若开始重复此过程;若w已访问,再访问与已访问,再访问与v有边相连的其有边相连的其它顶点;它顶点;3)若与若与v有边相连的顶点都被访问过,则退回到前一个访问有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才过程,直到图中所有顶点都被访问完止。顶点并重复刚才过程,直到图中所有顶点都被访问完止。4)深度优先搜
19、索是一种递归的过程深度优先搜索是一种递归的过程从图中某顶点从图中某顶点v出发:出发:V0 V7 V6 V5 V4 V3 V2 V11)访问顶点访问顶点v;2)依次从依次从v的未被访问的邻接点的未被访问的邻接点出发,对图进行深度优先遍历;出发,对图进行深度优先遍历;先序遍历(先序遍历(DLR)若二叉树非空若二叉树非空1)访问根结点;访问根结点;2)先序遍历左子树;先序遍历左子树;3)先序遍历右子树;先序遍历右子树;深度优先遍历深度优先遍历如果将图顶点的邻接点看如果将图顶点的邻接点看作二叉树结点的左、右孩作二叉树结点的左、右孩子深度优先遍历与先序遍子深度优先遍历与先序遍历是不是很类似?历是不是很类
20、似?深度遍历:深度遍历:V1V1 V2 V2 V4 V4 V8 V8 V5 V5 V6 V6 V3 V3 V7V7深度遍历:深度遍历:V1V1 V2 V2 V4 V4 V8 V8 V3 V3 V6 V6 V7 V7 V5V5V6V1V2V4V5V3V7V8V1V2V4 V5V3V7V6V8由于没有规定访问邻接由于没有规定访问邻接点的顺序点的顺序,深度优先序深度优先序列不是唯一的列不是唯一的对某顶点的深度优先遍历的递归算法:对某顶点的深度优先遍历的递归算法:Boolean visitedMAX;void DFSTraverse(Graph G,int v)for(v=0;vG.vexnum;+v
21、)visitedv=FALSE;for(v=0;v=0;w=NextAdjVex(G,v,w)if(!visitedw)DFS(G,w);以以v为起点对为起点对G进行进行DFS搜索搜索/访问顶点访问顶点v/对对v的尚未访问过的邻的尚未访问过的邻 接点接点w递归调用递归调用DFS在遍历时,对图中每个顶点至多调用一次在遍历时,对图中每个顶点至多调用一次DFS 函函数,因为一旦某个顶点被标志成已被访问,就不再数,因为一旦某个顶点被标志成已被访问,就不再从它出发进行搜索。因此,遍历图的过程实质上是从它出发进行搜索。因此,遍历图的过程实质上是对每个顶点查找其邻接点的过程。其耗费的时间则对每个顶点查找其邻
22、接点的过程。其耗费的时间则取决于所采用的存储结构。取决于所采用的存储结构。深度优先搜索的算法复杂度:深度优先搜索的算法复杂度:广度优先搜索遍历类似于树的按层次遍历。设图广度优先搜索遍历类似于树的按层次遍历。设图G的初的初态是所有顶点均未访问,在态是所有顶点均未访问,在G 中任选一顶点中任选一顶点v作为初始点,作为初始点,则广度优先搜索的基本思想是:则广度优先搜索的基本思想是:1)首先访问顶点首先访问顶点v,并将其访问标志置为已被访问,即,并将其访问标志置为已被访问,即visitedv=TRUE;2)接着依次访问与顶点接着依次访问与顶点v有边相连的所有顶点有边相连的所有顶点W1,W2,Wt;3)
23、然后再按顺序访问与然后再按顺序访问与W1,W2,Wt有边相连又未曾有边相连又未曾访问过的顶点;依此类推,直到图中所有顶点都被访问访问过的顶点;依此类推,直到图中所有顶点都被访问完为止完为止。7.3.2 广度优先搜索广度优先搜索即广度优先搜索遍历图的过程中以即广度优先搜索遍历图的过程中以v为起始点,由近至远,为起始点,由近至远,依次访问和依次访问和v有路径相通且路径长度为有路径相通且路径长度为1,2,的顶点。的顶点。V6V6V1V1V2V2V4V4V5V5V3V3V7V7V8V8 V0V0 V7V7 V6V6 V5V5 V4V4 V3V3 V2V2 V1V1V0V0 V1V1 V3V3 V2V2
24、 V7V7 V6V6 V5V5 V4V4在遍历过程中在遍历过程中所经过的路径所经过的路径求图求图G 的以的以V0起点的的广度优先序列:起点的的广度优先序列:V0,V1,V2,V3,V4,V5,V6,V7由于没有规定访问邻由于没有规定访问邻接点的顺序接点的顺序,广度优先广度优先序列不是唯一的序列不是唯一的从图中某顶点从图中某顶点v v出发:出发:1)1)访问顶点访问顶点v v;(容易实现容易实现)2)2)访问访问v v的所有未被访问的邻接点的所有未被访问的邻接点w w1 1,w,w2 2,w wk k;(容易实现容易实现)3)3)依次从这些邻接点依次从这些邻接点(在步骤在步骤2 2)访问的顶点)
25、访问的顶点)出发,访问它们出发,访问它们的所有未被访问的邻接点的所有未被访问的邻接点;依此类推,直到图中所有访问过依此类推,直到图中所有访问过的顶点的邻接点都被访问;的顶点的邻接点都被访问;为实现为实现 3)3),需要保存在步骤,需要保存在步骤2 2)中访问的顶点,而且访问这)中访问的顶点,而且访问这些顶点邻接点的顺序为:先保存的顶点,其邻接点先被访问。些顶点邻接点的顺序为:先保存的顶点,其邻接点先被访问。V0 V7 V6 V5 V4 V3 V2 V1广度优先遍历算法(类似于树的按层遍历)广度优先遍历算法(类似于树的按层遍历)在广度优先遍历算法中,需设置在广度优先遍历算法中,需设置一队列一队列
展开阅读全文