数据结构第七章图课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构第七章图课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第七 课件
- 资源描述:
-
1、图的定义和术语图的存储结构图的遍历生成树 最短路径拓扑排序 习题 图是一种较线性表和树更为复杂的数据结构。图是一种较线性表和树更为复杂的数据结构。在在线性表线性表中,数据元素之间有中,数据元素之间有线性关系线性关系,每一个数,每一个数据元素只有一个直接前驱和一个直接后续;在据元素只有一个直接前驱和一个直接后续;在树树形形结构中,数据元素之间有着明显的结构中,数据元素之间有着明显的层次关系层次关系,即每,即每一个数据元素有一个直接前驱一个数据元素有一个直接前驱(双亲双亲)和零个或多个和零个或多个直接后续直接后续(孩子孩子);而在;而在图图形结构中,结点之间的关形结构中,结点之间的关系是系是任意的
2、任意的,图中任意两个数据元素之间都可能相,图中任意两个数据元素之间都可能相关。由此,图的应用极为广泛。例如,城市间的最关。由此,图的应用极为广泛。例如,城市间的最短路径,火车的联票,交通网的计划,战场上的运短路径,火车的联票,交通网的计划,战场上的运输问题,庞大的施工进度图等都是图的应用。输问题,庞大的施工进度图等都是图的应用。 图的定义和术语定义:定义: 图图(graph):是一种数据结构,由二个集合是一种数据结构,由二个集合V和和E组成,组成,记作记作G=(V,E)。其中。其中V是数据元素是数据元素(顶点顶点)的非空有限集,的非空有限集,E是是V中二元关系中二元关系(边边edge)的集合。
3、树是图的特例,而线性表是的集合。树是图的特例,而线性表是树的特例。树的特例。术语:术语: 有向图:有向图:图的每条边都是有序顶点对图的每条边都是有序顶点对(即边是有方向即边是有方向)。 弧:弧:有向图的边。并将构成该边的有序顶点对用一对有向图的边。并将构成该边的有序顶点对用一对尖括号括起来。如尖括号括起来。如E,表示从,表示从顶点顶点u到到顶点顶点v的一条的一条弧弧,称,称u为为弧尾弧尾或或初始点初始点,v为为弧头弧头或或终端点终端点。并且说。并且说v是与是与u相邻的顶点相邻的顶点,或,或v是是u的的邻接点邻接点 例如,图例如,图7.1(a)所示的为有向图,它是由集合所示的为有向图,它是由集合
4、 V=v0,v1,v2,v3 E=,组成的。组成的。图图7.1 (a)有向图有向图G1 无向图:无向图:图的每条边是无方向的,有图的每条边是无方向的,有E,必有,必有E。即用圆括号括起来即用圆括号括起来 (u,v)E表示边,并且,表示边,并且,u和和v互称为邻接点互称为邻接点 例如,图例如,图7.1(b) 为无向图,它是由集合为无向图,它是由集合 V= v0,v1,v2,v3,v4 E=(v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3) ,(v2,v4)组成的。组成的。网络:网络:若图中每条边或弧都附加一个数值作为权若图中每条边或弧都附加一个数值作为权,带权图。带权
5、图。子图:子图:若若G1=V1,E1,G2=V2,E2是两个图,且是两个图,且V2被包含被包含在在V1中,中,E2被包含在被包含在E1中,则称图中,则称图G2是图是图G1的子图。的子图。度:度:无向图中,顶点的度是依附于该顶点的边数。无向图中,顶点的度是依附于该顶点的边数。有向图有向图中,中,该顶点入边的数目叫入度,该顶点出边的数目叫出度,该顶该顶点入边的数目叫入度,该顶点出边的数目叫出度,该顶点的度就是入度点的度就是入度+出度。出度。图中的顶点度数之和等于边数的图中的顶点度数之和等于边数的2倍。倍。路径:路径:在有向图在有向图(或无向图或无向图)中,如果存在首尾相接并且无重中,如果存在首尾相
6、接并且无重复边的边序列复边的边序列, (或或 (v0,v1),(v1,v2),(vn-2,vn-1),那么称这个序列是一条从顶点到,那么称这个序列是一条从顶点到v0到到vn-1的一条路径,记着的一条路径,记着(v0,v1,v2,vn-2,vn-1)。序列中的。序列中的边数边数称为称为路径长度路径长度。在有向图中,路径是有方向的;而在无。在有向图中,路径是有方向的;而在无向图中,路径无方向。向图中,路径无方向。简单路径:简单路径:在一条路径中,若除起点和终点外,所有顶点彼在一条路径中,若除起点和终点外,所有顶点彼此各不相同。此各不相同。回路:回路:在一条路径中,若起点和终点是同一顶点。在一条路径
7、中,若起点和终点是同一顶点。简单回路:简单回路:有简单路径组成的回路称为简单回路。有简单路径组成的回路称为简单回路。连通:连通:在无向图在无向图G中,若从顶点中,若从顶点vi到顶点到顶点vj有路径存在。有路径存在。连通图:连通图:在无向图在无向图G中,若任意二个顶点之间都是连通的中,若任意二个顶点之间都是连通的.连通分量:连通分量:在非连通的无向图在非连通的无向图G中,极大连通子图中,极大连通子图(在满足在满足连通条件下,尽可能多的包含连通条件下,尽可能多的包含G中的顶点和这些顶点之间中的顶点和这些顶点之间的边的边) . 如图如图7.2中,图中,图G有三个连通分量。有三个连通分量。 (a)(a
8、)有向图有向图G (b)G (b)图图G G的三个连通分量的三个连通分量强连通:强连通:在有向图在有向图G中,若从顶点中,若从顶点vi到顶点到顶点vj有路径存在,有路径存在,并且从顶点并且从顶点vj到顶点到顶点vi也有路径存在。也有路径存在。强连通图:强连通图:在有向图在有向图G中,若任意二个顶点之间都是强连通中,若任意二个顶点之间都是强连通的。的。 强连通分量:在非强连通的有向图强连通分量:在非强连通的有向图G中,极大强连通中,极大强连通子图称为有向图的强连通分量。如图子图称为有向图的强连通分量。如图7.3中,有向图中,有向图G有两有两个强连通分量。个强连通分量。生成树:生成树:在一个有在一
9、个有n顶点的连通图顶点的连通图G中,存在一个极小的连中,存在一个极小的连通子图通子图G,G包含图包含图G的所有顶点,但只有的所有顶点,但只有n-1条边,并且条边,并且G是连通的。是连通的。(a)有向图G (b)图G的二个强连通分量 图7.3 有向图及其强连通分量 图的存储结构 常用的图的存储结构有邻接矩阵、邻接表、十字链表、常用的图的存储结构有邻接矩阵、邻接表、十字链表、多重链表等方法。本节介绍最为常用的邻接矩阵和邻接表多重链表等方法。本节介绍最为常用的邻接矩阵和邻接表方法。对图的存储结构的选择取决于具体的应用。方法。对图的存储结构的选择取决于具体的应用。1、 邻接矩阵邻接矩阵(1)存储形式存
10、储形式 邻接矩阵是用一个邻接矩阵是用一个二维数组二维数组来表示图中顶点间的相邻来表示图中顶点间的相邻关系的数据结构。关系的数据结构。 设图设图G=(V,E),有,有n1个顶点,则所对应图个顶点,则所对应图G的邻接矩的邻接矩阵阵A是按如下定义的一个是按如下定义的一个nn的二维数组。的二维数组。否否则则0 0E E) )v v, ,v v( (对对有有向向图图为为j ji iE,vvjiji)( 1A若若若图若图G是一个网络,其邻接矩阵是一个网络,其邻接矩阵 i ij jj ji ij ji ii ij j) )的的权权值值为为w wv v, ,且且( (v vE E, ,) )v v, ,若若(
11、 (v v w wAji借助于邻接矩阵很容易判定任意两个顶点之间是否有边借助于邻接矩阵很容易判定任意两个顶点之间是否有边(或或弧弧)相连,并容易求得各个顶点的度,操作方便。相连,并容易求得各个顶点的度,操作方便。 (2)邻接矩阵法的特点:邻接矩阵法的特点:1. 存储空间:对于无向图而言,它的邻接矩阵是对称矩阵,存储空间:对于无向图而言,它的邻接矩阵是对称矩阵,所以可采用压缩存储法(下三角),其存储空间只需所以可采用压缩存储法(下三角),其存储空间只需n(n+1)/2。但对于有向图而言,因为它的弧是有方向的,它的邻接矩阵不但对于有向图而言,因为它的弧是有方向的,它的邻接矩阵不一定是对称矩阵,所以
12、需要一定是对称矩阵,所以需要n2个存储空间。个存储空间。2. 便于运算:采用邻接矩阵表示法,便于判定图中任意两个便于运算:采用邻接矩阵表示法,便于判定图中任意两个顶点之间是否有边相连,即根据顶点之间是否有边相连,即根据Ai,j=0或或1来判断。另外还来判断。另外还便于求得各个顶点的度。便于求得各个顶点的度。 2、 邻接表邻接表(1)存储形式存储形式 对一个有对一个有n个顶点图的顶点进行编号,顶点的编号从个顶点图的顶点进行编号,顶点的编号从1到到n。图的。图的邻接表邻接表存储结构与存储结构与树的孩子表示法相同树的孩子表示法相同。将图。将图G中每个顶点中每个顶点vi的所有的所有邻接点邻接点用用一个
13、单链表一个单链表(邻接点链表邻接点链表)表示,表示,在在vi的邻接点链表中存放的邻接点链表中存放vj(有有(vi,vj)或或E)的编号,的编号,以及其它与该边或弧相关的信息。一个图有以及其它与该边或弧相关的信息。一个图有n个顶点个顶点就有就有n个个邻接点链表邻接点链表(度为度为0的顶点,所对应的邻接点链表为空表的顶点,所对应的邻接点链表为空表)。这。这n个邻接点个邻接点链表的头指针又构成一个线性表链表的头指针又构成一个线性表,用一个指针数,用一个指针数组存储该线性表,这样就构成了图的邻接表的存储结构。例组存储该线性表,这样就构成了图的邻接表的存储结构。例如,在图如,在图7.1中,中,G1和和G
14、2的的邻接表如图的的邻接表如图7.5所示,图中下标所示,图中下标对应顶点对应顶点vi的编号。的编号。 (a)G1的邻接表 (b)G2的邻接表 图7.5 邻接表存储结构 逆邻接表:逆邻接表:对于为网络的图对于为网络的图G=(V,E),在,在node结构中可以添结构中可以添加一个权值域。而对于有向图,图加一个权值域。而对于有向图,图7.5(a)所示为按所示为按G1出度建立出度建立的邻接表,在该邻接表中求每个顶点的邻接表,在该邻接表中求每个顶点vi的出度和以的出度和以vi为尾的弧为尾的弧方便,但若要求顶点的入度,必须遍历整个邻接表。所以,方便,但若要求顶点的入度,必须遍历整个邻接表。所以,有时为了使
15、求顶点有时为了使求顶点vi的入度和以的入度和以vi为头的弧方便,可以建立该为头的弧方便,可以建立该有向图的逆邻接表,即在有向图的逆邻接表,即在vi的邻接点链表中存放的邻接点链表中存放vj(有有E)的编号。如图的编号。如图7.6所示为图所示为图7.1(a)中中G1的逆邻接表。的逆邻接表。图7.6 G1的逆邻接表 生成无向带权图的邻接表的算法:生成无向带权图的邻接表的算法:Const n:=图顶点数; e:=图中边数;Type edge=edgenode; edgenode=record adj:1.n; weight:weighttype next:edge; end; vexnode=reco
16、rd data:datatype; link:edge; end; dajlish=arrar1.nof vexnode;Procedure create(var g:dajlish );Begin for i:=1 to n do begin read(gi.data); gi.link:=nil; end; for k:=1 to e do begin read(i,j,w); new(s); s.adj:=j; s.weight:=w; s.next:=gi.link; gi.link:=s; End;End; 思考并实现:1、分别在无向图和有向图的邻接表上统计各顶点的度(有向图为入度和
17、出度)。2、统计图(有向图和无向图)的顶点度数和。2、 边集数组表示法边集数组表示法v1v5v2v3v4254371边数123456起点112234终点253545权4532177.3 图的遍历 与树的遍历相同,把按一定的规律沿着图中的边访问图的每个顶点,并且使每一个顶点只被访问一次的过程称为图的遍历。 因为在图中任意两个顶点之间都可能有关系。为保证每一个顶点只被访问一次,必须对访问过的顶点进行标记,一般是用一个辅助数组visiti作为对顶点的标记。当顶点vi未被访问,visiti值为0;当顶点vi已被访问,则visiti值为1。 图的遍历方法通常有先深度遍历和先广度遍历两种。但经常称这两种遍
18、历为深度优先搜索DFS和广度优先搜索BFS。7.3.1 深度优先搜索深度优先搜索DFS(Depth First Search) 图的深度优先搜索是树的先序遍历的推广,其定义(递归)如下: (1)从图G=(V,E)中选任意某个未访问过的顶点vi作为搜索的出发点。 (2)访问vi。 (3)以vi的每一个未被访问过的邻接点w为出发点,深度优先搜索图G。 (4)直至图G中所有与vi有路径相通的顶点都被访问过。 (5)若图G中尚有顶点未曾访问过,则转到(1);否则,搜索结束。 其中实箭头代表访问方向,虚箭头代表回溯方向,箭头旁边的数其中实箭头代表访问方向,虚箭头代表回溯方向,箭头旁边的数字代表搜索顺序,
19、字代表搜索顺序,A为起始顶点。为起始顶点。8ADGBEHCFI1236710114155149131216访问序列为:访问序列为:A、B、C、F、E、G、D、H、I。深度优先搜索算法:Procedure dfs(i:1.n);图用邻接表存储,其他方式的存储只需稍作修改,gi为表头结点表Begin write(gi.v);输出是最为简单的访问方式 visitedi:=true; p:=gi.link; while pnil do begin j:=p.adj;j为i的一个后继 if not visitedj then dfs(j);递归 p:=p.next; 回溯 end;end/; 7.3.2
20、 广度优先搜索广度优先搜索BFS(Breadth First Search) 图的广度优先搜索与按层次遍历树相似,定义如下: (1)从图G=(V,E)中选任意某个未访问过的顶点vi作为搜索的出发点。 (2)访问vi。 (3)依次访问vi的各个未曾访问过的邻接点。分别从这些邻接点出发进行广度优先搜索,直至图中所有与vi有路径相通的顶点都被访问过。 (4)若图中尚有顶点未曾访问过,则转到(1);否则,搜索结束。 ADGBEHCFI14657823访问序列为:访问序列为:A、B、E、D、C、G、F、H、I。广度优先搜索算法:Procedure bfs(i:1.n);图用邻接表g表示Begin cre
21、ate(q); 建队,置队空 write(gi.v); 访问vi visitedi:=true; 标记已经访问的结点 push(q,i); 进队列 while not empty(q) do 广度优先遍历,直到队列空为止,表示所有节点都被访问过了 begin i:=pop(q); 取顶点,对首元素出队 p:=gi.link; 取边表指针 while pnil do 还有后继顶点 begin if not visitedp.adj then begin write(gp.adj.v); 访问当前顶点 visitedp.adj:=true; push(q,p,adj); 当前顶点入队 end; p
22、:=p.next; 从边表中取下一个邻接边 end; end;End;生成树 1、概念 生成树是一个连通图G的一个极小的连通子图。包含图G的所有顶点,但只有n-1条边,并且是连通的。在生成树中,不存在回路路径,但若在生成树中任意增加一条边,则必构成回路。一个连通图的生成树不是惟一的,例如,对一个连通图进行深度优先,在搜索过程中经过的边和图的顶点,构成深度优先生成树;若进行广度优先搜索,则构成广度优先生成树。非连通图有若干个连通分量组成,每一个连通分量都存在生成树,这样就构成生成森林。2、 最小生成树最小生成树(最小支撑树最小支撑树) 若有一个连通的无向图G,它有n个顶点,并且它的边是有权值的。
23、在图G上构造生成树G(n个顶点,n-1条边,G是连通的),因为生成树的非惟一性,则有多个G存在,而最小生成树是n-1条边的权值之和最小的G。最小生成树也是非惟一的,但图G所有最小生成树的n-1条边的权值之和相同,并且为最小值。 例如,用带权的连通无向图G表示n个城市之间的交通网,最小生成树问题是:如何确定n-1条线路连通这n个城市,并且代价最小。 在带权的连通无向图G=(V,E)上,构造最小生成树有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法,它们都是利用最小生成树中简称为MST的性质:U是顶点集V的一个非空子集,若(u,v)是一条具有最小权值的边,其中uU,vV-U,则必存在一棵
24、包含边(u,v)的最小生成树。(1)普里姆普里姆(Prim)算法算法 该算法是利用MST性质,描述如下: 假设G=(V,E)是带权的连通无向图,从u0V开始构造G上最小生成树G=(U,TE),初始U=u0,TE=。重复以下步骤:在所有的uU(生成树中的顶点),vV-U(尚不在生成树中的顶点),且(u,v)E中找一条权值最小的边(u0,v0)并入TE,同时v0并入U,直至U=V时结束。此时,TE中包含n-1条边,并使n个顶点连通,且权值之和最小。如图7.8所示,其为在一个带权的连通无向图G中,构造最小生成树的过程。 为实现这个算法需要引入辅助数组辅助数组closest和lowcost记录从U到V
25、-U的权值最小的边。closesti=j(iV-U ,jU) ,表示顶点i到j的一条边(j,i),同时(j,i)是U到V-U中的顶点i权值最小的边。(j,i)的权值存放在lowcosti中。图7.8 普里姆算法构造最小生成树过程 在图7.8(c)中,U=0,2,5,V-U=1,3,4,对于U-V中的顶点1到U中的顶点的边有:(0,1)=6,(2,1)=5,(5,1)=,所以,U到顶点1权值最小的边是(2,1)=5,则 closest1=2。同样,可求出closest3=5,closest4=2。它们所对应的lowcost数组分别是:lowcost1=(2,1)=5,lowcost3= (5,3
展开阅读全文