收藏 分享(赏)

数据结构与算法7.ppt

上传人:Facebook 文档编号:3817449 上传时间:2018-11-19 格式:PPT 页数:46 大小:620KB
下载 相关 举报
数据结构与算法7.ppt_第1页
第1页 / 共46页
数据结构与算法7.ppt_第2页
第2页 / 共46页
数据结构与算法7.ppt_第3页
第3页 / 共46页
数据结构与算法7.ppt_第4页
第4页 / 共46页
数据结构与算法7.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

1、,数 据 结 构,(数据结构及其算法),冯耀霖,Chap 7 图,图的基本概念 图的实现图的遍历最短路径问题最小生成树,1 图的基本概念,图的定义 图的相关术语 图的基本操作,图(graph)是一种复杂的数据结构,它能够为解决许多具体问题提供非常理想的非数值数学模型。当今,图结构已广泛应用于计算机科学、系统工程、管理工程、通信与网络理论、自动控制、运筹学以至社会科学等诸多学科。图形结构所研究的图并非生活中所说的图画或地图,而是用一些点和线来表示事物之间关系的某种抽象模型,本质上是数据集合与其上关系的图形表示。,1.1 图的定义,图G由两个非空集合V和E组成。V是顶点(Vertex)的有限集,在

2、图中数据元素称为顶点或结点。E是边(Edge)的有限集,边是顶点的无序对或有序对,描述了顶点之间的逻辑关系,每一条边连接V中两个不同的顶点。图的形式化定义为G=(V, E)V=vi | viElemTypeE=(vi , vj) | vi , vjV或 E= | vi , vjV其中,(vi , vj) 为无序对,表示一条无向边,简称边;为有序对,表示一条有向边,简称弧。,1.2 图的相关术语,1. 无向图在一个图中,如果连接任意2个顶点的是一条无向边(vi ,vj),即顶点之间的连线是无方向的,则称该图为无向图。如图7.1。G1=(V1, E1)V1=A,B,C,D,EE1=(A,B), (

3、A,D), (B,C), (B,E), (C,D), (C,E),A,B,C,D,E,A,B,C,D,图7.1 无向图G1,图7.2 有向图G2,2. 有向图在一个图中,如果连接任意2个顶点的是一条弧,即顶点之间的连线是有方向的,则称该图为有向图。对于弧,vi 被称为起点(弧尾),vj 被称为终点(弧头)。如图7.2。G1=(V1, E1)V1=A,B,C,DE1=, , , , 3. 混合图混合图是既含有边又含有弧的图。,4. 无向完全图在一个无向图中,如果任意2个顶点之间都有一条边连接,则称该图为无向完全图。在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。5. 有向完全图在一个有

4、向图中,如果任意2个顶点之间都有方向互为相反的2条弧相连接,则称该图为有向完全图。在一个含有n个顶点的有向完全图中,有n(n-1)条弧。,6. 顶点的度顶点的度是指依附于某顶点v 的边数,记作deg(v)。在有向图中,顶点的度有入度和出度之分。对于任意顶点v,以v为起点的弧的数目称为v的出度,记为OD(v);而以v为终点的弧的数目称为v的入度,记为ID(v)。各个顶点的度都相等的无向图也称为正则图,并记作k -正则图,其中k 是各顶点的度。图7.3是个3-正则图,也被称为“彼得森图”。7. 权(weight)与图的边或弧相关的数值,用于表示从一个顶点到另一个顶点的距离、所需的时间或花费的代价等

5、。,图7.3 彼得森图,8. 网络网络也称带权图,即图中的边(弧)都是带权的边(弧)。实际上,所有的图都可以看成作网络的一种特殊情况,即一个图可以被看作是一个所有边(弧)具有相同权的网络。带权图的结构与现实生活紧密联系,因此它通常具有更加广泛的应用。图7.4给出了一个无向带权图的例子,它表示一张区域地图,图中的顶点为城市,边代表两个城市之间的连通关系,边上的权代表公路造价。现在要求用公路把所有城市联系起来,如何设计可使得工程的总造价最低?这是典型的无向图最小生成树问题。,10,8,21,18,5,6,7,25,19,33,图7.4 城市连接图,9. 路径(path)顶点vi 与vj 之间的通路

6、称为从vi 到vj 的路径。路径中边(弧)的数目称为路径长度。路径可以简便地用顶点序列表示,如(a,b,c,d)或abcd。路径中有连接边(弧)的两个顶点称为邻接顶点。如果路径中没有重复边(弧),那么该路径叫做简单路径。如果路径中没有重复顶点,则该路径叫做基本路径。显然,基本路径一定是简单路径。如果始点与终点相同,那么该路径称为回路。没有重复边(弧)的回路称为简单回路,而除始点与终点外,没有其他重复顶点的回路称为基本回路。,例如:abcd 是一条基本路径abcdbe 是一条简单路径abca 是一条基本回路,10. 子图如果图G=(V,E)和图G=(V,E),满足VV和EE,则称G为G的子图。如

7、果G为G的子图,且GG,则称G是G的真子图。当VV,EE时,则称G是G的生成子图。,A,B,E,C,D,(a) G1的2个子图,A,B,C,E,D,(b) G1的生成子图,图7.5 子图,11. 连通与连通图如果从顶点v到顶点w有一条路径,则说v和w是连通的。如果无向图中任意两个顶点都是连通的,则称该图是连通图。对于一个非连通图的无向图,其中的每一个连通部分称作一个连通分量,即连通分量是无向图中的极大连通子图。图7.6(a)是一个非连通的无向图,它有2个连通分量,如图7.6(b)。对于有向图来说,如果任意一对顶点vi 和vj(ij)都存在从vi 到vj 的一条路径,也存在从vj 到vi 的一条

8、路径,则称该有向图是强连通图。对于一个非强连通图的有向图,其中的每一个强连通部分称作一个强连通分量,即强连通分量是有向图中的极大强连通子图。如图7.7是图7.2的强连通分量。,A,B,C,D,E,F,A,B,C,D,E,F,图7.6 无向图及连通分量,(a) 非连通的无向图,(b) 2个连通分量,12. 生成树生成树是无向连通图的极小连通子图。它包含了图的所有n个顶点,但只包含图的n-1条边。这n-1条边使这n个顶点互相连通。在生成树中添加任意一条属于原图中的边必定会产生回路。而减少生成树中的任意一条边,则必然成为非连通的。,13. 稀疏图和稠密图稀疏图和稠密图是两个相对的定义。通常认为边(弧

9、)较少的图就是一个稀疏图;相对地,接近完全图的图就是稠密图。注意这里给出的定义仅仅是一个形式化的描述,没有一个十分完备的标准来界定到底多少才算稀疏。之所以提出稀疏图和稠密图的概念,是因为稀疏图可以使用稀疏矩阵来表示,进而节省存储空间。,1.3 图的基本操作,1. 非带权图的基本操作GetElem功能:求顶点的元素值SetElem功能:设置顶点的元素值GetVexNum功能:返回顶点个数GetEdgeNum功能:返回边的个数GetArcNum功能:返回弧的个数,FirstAdjVex功能:返回指定顶点的第一个邻接顶点NextAdjVex功能:返回下一个邻接顶点InsertEdge功能:插入一条边

10、DeleteEdge功能:删除一条边InsertArc功能:插入一条弧DeleteArc功能:删除一条弧EdgeExist功能:判断指定顶点之间是否存在边,ArcExist功能:判断指定顶点之间是否存在弧DFTraverse功能:深度优先遍历BFTraverse功能:广度优先遍历,2. 带权图(网)的基本操作,除上述操作外,还应提供如下基本操作:SetWeight功能:设置指定边(弧)的权值GetWeight功能:返回指定边(弧)的权值InsrtWeiEdge功能:插入一条带权边InsrtWeiArc功能:插入一条带权弧,2 图的实现,邻接矩阵 邻接矩阵图的实现 邻接表 邻接表图的实现,2.1

11、 邻接矩阵,图可以有多种存储表示方法,但最常用的只有两种:邻接矩阵和邻接表。,1. 邻接矩阵的定义,邻接矩阵存储结构的基本思想是:用一维数组存储图中顶点的信息,而用矩阵表示各顶点之间的邻接关系。显然,该方法的关键是顶点之间的邻接关系的存储表示。,假设图G=(V,E)有n个确定的顶点,即V=v0 ,v1 ,vn ,则可用一个nn的矩阵来表示G中各顶点之间的邻接关系,故称邻接矩阵(Adjacency Matrix)。对于非网图,矩阵元素的定义如下:1 存在(vi ,vj )或AMi j = 0 不存在(vi ,vj )或对于网图,矩阵元素的定义如下:wij 存在(vi ,vj )或AMi j =

12、不存在(vi ,vj )或其中,是比任何权值更大的一个数值。,图7.7 一个无向图的邻接矩阵表示,AM=,0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0,V0,V3,V1,V2,图7.8 一个网图的邻接矩阵表示,AM=, 9 6 4 9 4 5 6 4 7 3 5 8 7 8 ,V0,V3,V1,V2,V4,9,6,3,4,5,7,8,邻接矩阵存储方法的特点:,无向图的邻接矩阵一定是一个对称矩阵。因此,在具体存放邻接矩阵时只需存放上下三角矩阵的元素即可。对于无向图,邻接矩阵的第i行列非0元素(或非元素)的个数正好是第i个顶点的度。对于有向图,邻接矩阵的第i行非0元素(或非元素)

13、的个数正好是第i个顶点的出度OD(vi),而第i列非0元素(或非元素)的个数正好是第i个顶点的入度ID(vi)。用邻接矩阵方法存储图,很容易确定图中任意2个顶点之间是否有边(弧)相连;但要确定图中有多少条边(弧),则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是使用邻接矩阵存储方法的局限性。,2. 图的抽象类,图的抽象类规定了图的最基本的操作。,template class Graph protected:int verNum, edgeNum; /顶点数和边数 public:/插入添加一个新顶点virtual void InsertVer(TypeOfVer e)=0; /删除

14、顶点v及其所有相关的边virtual bool DeleteVer(TypeOfVer v)=0; virtual bool InsertEdge(TypeOfVer u, TypeOfVer v)=0; virtual bool DeleteEdge(TypeOfVer u, TypeOfVer v)=0;virtual bool EdgeExsit(TypeOfVer u, TypeOfVer v)=0;virtual int GetVerNum() return verNum; virtual int GetEdgeNum() return edgeNum; ;,3. 邻接矩阵图的实现,

15、template class AdjMatrixGraph: public Graph protect:TypeOfVer *verList; /顶点元素表TypeOfWeight *edge ; /存放边的邻接矩阵int GetVerPos(TypeOfVer v);/获取顶点在图中的位置,public:AdjMatrixGraph(int n; TypeOfVer v); AdjMatrixGraph();int GetVerPos(TypeOfVer v);/获取顶点在图中的位置void InsertVer(TypeOfVer e);void DeleteVer(TypeOfVer v)

16、; bool InsertEdge(TypeOfVer u, TypeOfVer v);bool DeleteEdge(TypeOfVer u, TypeOfVer v);bool EdgeExsit(TypeOfVer u, TypeOfVer v);bool Empty();bool SetElem(int v, TypeOfVer e);bool GetElem(int v, TypeOfVer ,算法7.1 AdjMatrixGraph 功能:(构造函数)图的初始化,AdjMatrixGraph(int n, TypeOfVer elem) int i, j;verNum=n; edg

17、eNum=0;verList=new TypeOfVern; /初始化顶点元素表for(i=1; i=n; i+)verListi=elemi;edge=new TypeOfEdge *n; /初始化邻接矩阵for(i=1; i=n; i+) edgei=new TypeOfEdgen;for(j=1; j=n; j+)edgeij=0;,算法7.2 AdjMatrixGraph 功能:(析构函数)销毁图, AdjMatrixGraph() int j;delete verList;for(j=1; j=verNum; j+)delete edgej; /释放邻接矩阵的行指针delete ed

18、ge; /释放邻接矩阵 ,算法7.3 GetVerPos 功能:获取顶点在图中的位置,int GetVerPos(TypeOfVer v) int j;for( j=1; j=verNum; j+)if(verListj=v)return j;return 0; ,算法7.4 InsertEdge 功能:插入一条边,bool InsertEdge(TypeOfVer u, TypeOfVer v) int e1,e2;e1=GetVerPos(u);e2=GetVerPos(v);if(e1=0|e2=0)return FALSE;if(edgee1e2!=0)return FALSE;edg

19、ee1e2=1;edgeNum+;return TRUE; ,4. 邻接矩阵网图的实现,template class AdjMatrixNetwork: publicAdjMatrixGraph private:TypeOfEdge noEdge; /的表示 public:AdjMatrixNetwork(int n; TypeOfVer v); AdjMatrixNetwork();bool InsertEdge(TypeOfVer u, TypeOfVer v, TypeOfEdge w); ;,算法7.5 InsertEdge 功能:插入一条带权边,bool InsertEdge(Typ

20、eOfVer u, TypeOfVer v, TypeOfEdge w) int e1,e2;e1=GetVerPos(u);e2=GetVerPos(v);if(e1=0|e2=0)return FALSE;if(edgee1e2!=noEdge)return FALSE;edgee1e2=w;edgeNum+;return TRUE; ,算法7.6 FirstAdjVer 功能:返回顶点v的第一个邻接点的位置,int FirstAdjVer(int v) if(v0 ,算法7.7 NextAdjVer 功能:返回v的邻接点w的下一个邻接点,int NextAdjVer(int v) if(v0 ,2.2 邻接表,邻接表是图的一种顺序存储与链式存储相结合的存储方法。,Its Over,

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

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报