第7章图ppt课件.ppt
《第7章图ppt课件.ppt》由会员分享,可在线阅读,更多相关《第7章图ppt课件.ppt(138页珍藏版)》请在三一办公上搜索。
1、第7章 图,教学目标 图是一种重要的非线性结构,在系统工程,控制论,人工智能,编译系统等领域中有广泛的应用,熟练掌握其逻辑结构、存储结构各种运算。重点、难点 图的抽象数据类型定义,图的实现(邻接矩阵、邻接表、十字链表),图的遍历,图的应用(用普里姆算法求最小生成树、拓扑排序、关键路径、用迪杰斯特拉算法求最短路径)。教学方法 采用讲授、提问、论证上机等方法 实现。,第7章 图,7.1 图的定义与基本术语7.2 图的存储结构7.3 图的遍历7.4 图的应用7.5总结与提高,返回主目录,图结构与表结构和树结构的不同表现在结点之间的关系上,线性表中结点之间的关系是一对一的;树是按分层关系组织的结构,树
2、结构之间是一对多;对于图结构,图中顶点之间的关系可以是多对多,即一顶点和其它顶点间的关系是任意的,可以有关也可以无关。因此,图 G 树T L,图是一种比较复杂的非线性数据结构。,图作为一种非线性结构,被广泛应用于多个技术领域。在本章中,主要是应用图论的理论知识来讨论如何在计算机上表示和处理图,以及如何利用图来解决一些实际问题。,7.1 图的定义与基本术语,7.1.1 图的定义 图(Graph)是一种网状数据结构,其形式化定义如下:,Graph=(V,R)V=xxDataObjectR=VR VR=P(x,y)(x,yV),DataObject为一个集合,该集合中的所有元素具有相同的特性。V中的
3、数据元素通常称为顶点(vertex),VR是两个顶点之间的关系的集合。P(x,y)表示x和y之间有特定的关联属性P。,弧:若VR,则表示从顶点x到顶点y的一条弧(arc),并称x为弧尾(tail)或起始点,称y为弧头(head)或终端点。,有向图:若图中的边是有方向的,称这样的图为有向图。,无向图:若VR,必有VR,即VR是对称关系,这时以无序对(x,y)来代替两个有序对,表示x和y之间的一条边(edge),此时的图称为无向图。,例如:下图G1是有向图,G2是无向图,在图中,我们可以将任一顶点看成是图的第一个顶点,同理,对于任一顶点而言,它的邻接点之间也不存在顺序关系。为了操作的方便,我们需要
4、将图中的顶点按任意序列排列起来。顶点在这个人为的随意排列中的位置序号称为顶点在图中的位置。,图的基本操作和其它数据结构一样,也有创建、插入、删除、查找等。,图的抽象类型定义:ADT Graph数据对象V:一个集合,该集合中的所有元素具有相同的特性。数据关系R:R=VR VR=P(x,y)(x,yV),基本操作:(1)CreateGraph(G)操作前提:已知图G不存在操作结果:创建图G。(2)DestoryGraph(G)操作前提:已知图G存在;操作结果:销毁图G。(3)LocateVertex(G,v)操作前提:已知图G存在,顶点v值合法;操作结果:若顶点v在图G中存在,则返回顶点v在图G中
5、的位置。若图G中没有顶点v,则函数返回值为“空”。(4)GetVertex(G,i)操作前提:已知图G存在;操作结果:返回图G中的第i个顶点的值。若i大于图G中顶点数,则函数返回值为“空”。,(5)FirstAdjVertex(G,v)操作前提:已知图G存在,顶点v值合法;操作结果:返回图G中顶点v的第一个邻接点。若v无邻接点或图G中无顶点v,则函数值为“空”。(6)NextAdjVertex(G,v,w)操作前提:已知图G存在,w是图G中顶点v的某个邻接点,操作结果:返回顶点v的下一个邻接点(紧跟在w后面)。若w是v的最后一个邻接点,则函数值为“空”。(7)InsertVertex(G,u)
6、操作前提:已知图G存在,u值合法;操作结果:在图G中增加一个顶点u。(8)DeleteVertex(G,v)操作前提:已知图G存在,v值合法;操作结果:删除图G的顶点v及与顶点v相关联的弧。,(9)InsertArc(G,v,w)操作前提:已知图G存在,v值,w值合法;操作结果:在图G中增加一条从顶点v到顶点w的弧。(10)DeleteArc(G,v,w)操作前提:已知图G存在,v值,w值合法,存在弧(v,w);操作结果:删除图G中从顶点v到顶点w的弧。(11)TraverseGraph(G)操作前提:已知图G存在;操作结果:按照某种次序,对图G的每个顶点访问一次且仅访问一次。,7.1.2 基
7、本术语,设用n表示图中顶点的个数,用 e表示图中边或弧的数目,并且不考虑图中每个顶点到其自身的边或弧。,无向完全图:有n(n-1)/2条边(图中每个顶点和其余n-1个顶点都有边相连)的无向图为无向完全图。,有向完全图:有n(n-1)条边(图中每个顶点和其余n-1个顶点都有弧相连)的有向图为有向完全图。,稀疏图:对于有很少条边的图(e n log n)称为稀疏图,反之称为稠密图。,子图:设有两个图G=(V,E)和图G/=(V/,E/),若V/V且E/E,则称图G/为G的子图。,图G1和图G2的子图如图7.2所示。,(b)G2的子图,对于无向图 G=(V,E),如果边(v,v/)E,则称顶点v,v
8、/互为邻接点,即v,v/相邻接。边(v,v/)依附于顶点v和v/,或者说边(v,v/)与顶点v和v/相关联。对于有向图G=(V,A)而言,若弧A,则称顶点v邻接到顶点v/,顶点v/邻接自顶点v,或者说弧与顶点v,v/相关联。,邻接点:,度、入度和出度,对于无向图而言,顶点v 的度是指和v相关联的边的数目,记作TD(v)。,对于有向图而言,顶点v的度有出度和入度两部分:以顶点v为弧头的弧的数目称为该顶点的入度,记作ID(v),以顶点v为弧尾的弧的数目称为该顶点的出度,记作OD(v)则顶点v的度为:TD(v)=ID(v)+OD(v)。,一般地,若图G中有n个顶点,e条边或弧,则图中顶点的度与边的关
9、系如下:,权与网:在实际应用中,有时图的边或弧上往往与具有一定意义的数有关,即每一条边都有与它相关的数,称为权,这些权可以表示从一个顶点到另一个顶点的距离或耗费等信息。我们将这种带权的图叫做赋权图或网。,路径与回路,无向图G=(V,E)中从顶点v到v/的路径是一个顶点序列vi 0,vi1,vi2,vin,其中(vij-1,vij)E,1jn。如果图G是有向图,则路径也是有向的,顶点序列应满足A,1jn。,路径长度:指路径上经过的弧或边的数目。,回路或环:在一个路径中,若其第一个顶点和最后一个顶点是相同的,即v=v/,则称该路径为一个回路或环。简单路径:若表示路径的顶点序列中的顶点各不相同,则称
10、这样的路径为简单路径。简单回路:除了第一个和最后一个顶点外,其余各顶点均不重复出现的回路为简单回路。,连通图,连通图:在无向图G=(V,E)中,若从vi到vj有路径相通,则称顶点vi与vj是连通的。如果对于图中的任意两个顶点vi、vjV,vi,vj都是连通的,则称该无向图G为连通图。,连通分量:无向图中的极大连通子图称为该无向图的连通分量。,强连通图:在有向图G=(V,A)中,若对于每对顶点vi、vjV且vivj,从vi到vj和vj到vi都有路径,则称该有向图为强连通图。强连通分量:有向图的极大强连通子图称作有向图的强连通分量。,图G1和图G3的连通分量见p157的图7.4所示,7.2 图的存
11、储结构,图的存储结构方法有:邻接矩阵表示法;邻接表;邻接多重表;十字链表,邻接矩阵表示法,图的邻接矩阵表示法(Adjacency Matrix)也称作数组表示法。它采用两个数组来表示图:一个是用于存储顶点信息的一维数组,另一个是用于存储图中顶点之间关联关系的二维数组,这个关联关系数组被称为邻接矩阵。,若G是一具有n个顶点的无权图,G的邻接矩阵是具有如下性质的nn矩阵A:,G1和G2的邻接矩阵,若图G是一个有n个顶点的网,则它的邻接矩阵是具有如下性质的nn矩阵A:,有向网及其邻接矩阵,v1v2v3v4v5v65748 95 65 2 1,v1v2v3v4v5v6,(a)有向网N,(b)有向网N的
12、邻接矩阵,邻接矩阵表示法的C语言类型描述为:,#define MAX_VERTEX_NUM 10/*最多顶点个数*/#define INFINITY 32768/*最多顶点个数*/typedef enumDG,DN,UDG,UDN GraphKind;/*图的种类:DG表示有向图,DN表示有向网,UDG表示无向图,UDN表示无向网*/typedef char VertexData;/*假设顶点数据为字符型*/typedef struct ArcNode AdjType adj;/*对于无权图,用1或0表示是否相邻;对带权图,则为权值类型*/OtherInfo info;ArcNode;,typ
13、edef struct VertexData vexsMAX_VERTEX_NUM;/*顶点向量*/ArcNode arcs MAX_VERTEX_NUMMAX_VERTEX_NUM;/*邻接矩阵*/int vexnum,arcnum;/*图的顶点数和弧数*/GraphKind kind;/*图的种类标志*/AdjMatrix;/*(Adjacency Matrix Graph)*/,邻接矩阵法的特点:,1.存储空间:对于无向图而言,它的邻接矩阵是对称矩阵,所以可采用压缩存储法(下三角),其存储空间只需n(n-1)/2。但对于有向图而言,因为它的弧是有方向的,它的邻接矩阵不一定是对称矩阵,所以
14、需要n2个存储空间。,2.便于运算:采用邻接矩阵表示法,便于判定图中任意两个顶点之间是否有边相连,即根据Ai,j=0或1来判断。另外还便于求得各个顶点的度。,对于无向图而言,其邻接矩阵第 i 行元素之和就是图中第 i 个顶点的度:,对于有向图而言,其邻接矩阵第i行元素之和就是图中第i个顶点的出度,第i列元素之和就是图中第i个顶点的入度。,顶点i的出度:,顶点i的入度:,采用邻接矩阵存储法表示图,很便于实现图的一些基本操作,如 FirstAdjVertex(G,v):,(1)首先,由LocateVertex(G,v)找到v在图中的位置,即v在一维数组vexs中的序号i。(2)二维数组arcs中第
15、i行上第一个adj域非零的分量所在的列号j,便是v的第一个邻接点在图G中的位置。(3)取出一维数组vexsj中的数据信息,即与顶点v邻接的第一个邻接点的信息。,注意:稀疏图不适于用邻接矩阵来存储,因为这样会造成存储空间的浪费。,用邻接矩阵法创建有向网的算法如下:,int LocateVertex(AdjMatrix*G,VertexData v)/*求顶点位置函数*/int j=Error,k;for(k=0;kvexnum;k+)if(G-vexsk=v)j=k;break;return(j);,int CreateDN(AdjMatrix*G)/*创建一个有向网*/int i,j,k,we
16、ight;VertexData v1,v2;scanf(%d,%d,k+),scanf(%c,%c,%d,分析:该算法的时间复杂度为O(n2+en),其中 O(n2)时间耗费在对二维数组arcs的每个分量的arj域初始化赋值上。O(en)的时间耗费在有向网中边权的赋值上。,邻接表表示法,邻接表(Adjacency List)表示法实际上是图的一种链式存储结构。它的基本思想是只存有关联的信息,对于图中存在的边信息则存储,而对于不相邻接的顶点则不保留信息。在邻接表中,对图中的每个顶点建立一个带头结点的边链表,每个边链表的头结点又构成一个表头结点表。,这样,一个n个顶点的图的邻接表表示由表头结点表与
17、边表两部分构成。,(1)表头结点表:由所有表头结点以顺序结构(向量)的形式存储,以便可以随机访问任一顶点的单链表。表头结点有两部分构成,其中数据域(vexdata)用于存储顶点的名或其它有关信息;链域(firstarc)用于指向链表中第一个顶点(即与顶点vi邻接的第一个邻接点)。,表头结点结构为:,(2)边表:由表示图中顶点间邻接关系的n个边链表组成。它由三部分组成,其中邻接点域(adjvex)用于存放与顶点vi相邻接的顶点在图中的位置;链域(nextarc)用于指向与顶点vi相关联的下一条边或弧的结点;数据域(info)用于存放与边或弧相关的信息(如赋权图中每条边或弧的权值等)。,弧结点结构
18、为:,图例图G1、G2的邻接表表示法,邻接表存储结构的形式化说明如下:,#define MAX_VERTEX_NUM 10/*最多顶点个数*/typedef enumDG,DN,UDG,UDN GraphKind;/*图的种类*/typedef struct ArcNodeint adjvex;/*该弧指向顶点的位置*/struct ArcNode*nextarc;/*指向下一条弧的指针*/OtherInfo info;/*与该弧相关的信息*/ArcNode;,typedef struct VertexNode VertexData data;/*顶点数据*/ArcNode*firstarc;
19、/*指向该顶点第一条弧的指针*/VertexNode;typedef struct VertexNode vertexMAX_VERTEX_NUM;int vexnum,arcnum;/*图的顶点数和弧数*/GraphKind kind;/*图的种类标志*/AdjList;/*基于邻接表的图(Adjacency List Graph)*/,存储空间:对于有n个顶点,e条边的无向图而言,若采取邻接表作为存储结构,则需要n个表头结点和2e个表结点。,无向图的度:在无向图的邻接表中,顶点vi的度恰好就是第i个边链表上结点的个数。,有向图的度:在有向图中,第i个边链表上顶点的个数是顶点vi的出度。要想
20、求得该顶点的入度,则必须遍历整个邻接表。在所有单链表中查找邻接点域的值为i的结点并计数求和。,由此可见,对于用邻接表方式存储的有向图,求顶点的入度并不方便,因此需要有一种解决的方法逆邻接表法。,对图中的每一顶点vi建立一个递邻接表,即对每个顶点vi建立一个所有以顶点vi为弧头的弧的表,这样求顶点vi的入度即是计算逆邻接表中第i个顶点的边链表中结点个数。,图G1的逆邻接表表示法见p162的图7.10,十字链表,十字链表(Orthogonal List)是有向图的另一种链式存储结构。我们也可以把它看成是将有向图的邻接表和逆邻接表结合起来形成的一种链表。,有向图中的每一条弧对应十字链表中的一个弧结点
21、,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点。,这两类结点的结构见图所示。,图G1的十字链表表示,建立一个有向图的十字链表的算法如下:,void CrtOrthList(OrthList g)/*从终端输入n个顶点的信息和e条弧的信息,以建立一个有向图的十字链表*/scanf(“%d,%d”,i+)scanf(“%c”,g.vertexi.data);g.vertexi.firstin=NULL;g.vertexi.firsout=NULL;,for(k=0;ktailvex=i;p-headvex=j;p-tlink=g.vertexi.firstout;g.vertex
22、i.firstout=p;p-hlink=g.vertexj.firstin;g.vertexj.firstin=p;/*CrtOrthList*/,十字链表的优点:,在十字链表中既能够很容易地找到以vi为尾的弧,也能够容易地找到以vi为头的弧,因此对于有向图,若采用十字链表作为存储结构,则很容易求出顶点vi的度。,邻接多重表,邻接多重表(Adjacency Multi_list)是无向图的另外一种存储结构。使用邻接多重表这种存储结构是因为它能够提供更为方便的边处理信息。,邻接多重表是指将图中关于一条边的信息用一个结点来表示。,邻接多重表中的边结点结构和顶点结点结构,邻接多重表的结构类型说明如
23、下:,typedef struct EdgeNode int mark,ivex,jvex;struct EdgeNode*ilink,*jlink;EdgeNode;typedef struct VertexData data;EdgeNode*firstedge;VertexNode;,typedef struct VertexNode vertexMAX_VERTEX_NUM;int vexnum,arcnum;/*图的顶点数和弧数*/GraphKind kind;/*图的种类*/AdjMultiList;/*基于图的邻接多重表表示法(Adjacency Multi_list)*/,图G
24、2的邻接多重表见图所示。,7.4 图的遍历,图的遍历:从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次。,为了保证图中的各顶点在遍历过程中访问且仅访问一次,需要为每个顶点设一个访问标志,用以标示图中每个顶点是否被访问过,访问标志用数组visitedn来表示。,图的遍历方法有两种:深度优先搜索和广度优先搜索,深度优先搜索:,深度优先搜索(Depth_First Search)是指按照深度方向搜索,它类似于树的先根遍历。,深度优先算法的基本思想是:,(1)从图中某个顶点v0出发,首先访问v0。(2)找出刚访问过的顶点vi的第一个未被访问的邻接点,然后访问该顶点。重复此步骤,直到当前
25、的顶点没有未被访问的邻接点为止。(3)返回前一个访问过的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点。转2。,采用递归的形式说明,则深度优先搜索连通子图的的基本思想可表示为:,(1)访问出发点v0。(2)依次以v0的未被访问的邻接点为出发点,深度优先搜索图,直至图中所有与v0有路径相通的顶点都被访问。若此时图中还有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述深度优先搜索过程,直至图中所有顶点均被访问过为止。,深度优先搜索的过程示例见p167的7.15图所示。其中实箭头代表访问方向,虚箭头代表回溯方向,箭头旁边的数字代表搜索顺序,A为起始顶点。,访问序列为:A、B、C、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章图 ppt 课件

链接地址:https://www.31ppt.com/p-4787673.html