图—基本概念与抽象数据类型.ppt_第1页
图—基本概念与抽象数据类型.ppt_第2页
图—基本概念与抽象数据类型.ppt_第3页
图—基本概念与抽象数据类型.ppt_第4页
图—基本概念与抽象数据类型.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图 基本概念与抽象数据类型,2008/05/20,2,主要内容,图的基本概念 图抽象数据类型 图的周游方法 图的相邻矩阵及邻接表的表示方法 求图的最小生成树(林),3,图的基本概念,反映连通关系 反映连通属性,4,4,图与其他数据结构的关系,线性结构:唯一前驱,唯一后继,线性关系 树形结构:唯一前驱,多个后继,层次关系 图形结构:多对多、任意,网状关系 图结构中结点(图中通常称为顶点)的前驱和后继结点个数不再限制,即结点之间的关系是任意的 图是更复杂的非线性结构。,5,图由顶点(vertex)集合和边(edge)集合E组成, 记为G=(V,E)。 每条边就是一个顶点的偶对,所以E也就是V上的一个二元关系。 例如: V = a,b,c,d; E = , , , ,图的形式化定义,6,在有向图中, 表示从V1到V3的一条边,也称弧(尖括号表示)。V1为弧尾或始点,V3为弧头或终点。,在无向图中,(V1,V3)表示V1和V3之间的一条边。 (V1,V3) = (V3,V1) 无序对,有向图无向图,7,图顶点与边的关系,图G的顶点数n和边数e满足以下关系 若G是有向图,则0en(n-1) 有向完全图:有n(n-1)条边的有向图 若G是无向图,则0en(n-1)/2 无向完全图:有n(n-1)/2条边的无向图 在顶点个数相同的图中,完全图具有最多的边数,V1,V3,V2,V4,8,度 的定义,关联:由一个顶点发出的边构成与该定点的一个关联。 顶点的度:与该顶点关联的所有的边或弧的数目。 (邻接点的个数定义为顶点的度。) 入度:(仅对有向图)以该顶点为头的弧数。,9,路径,无向图中的顶点序列v1,v2, ,vk,若(vi,vi+1)E( i=1,2,k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路; 有向图中的顶点序列v1,v2, ,vk, 若E ( i=1,2,k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路; 路径上边或弧的数目称为该路径的路径长度。,10,连通图,在无(有)向图G =( V, E )中,若对任何两个不同顶点v、u都存在从v到u的路径,则称G是连通图。,连通图,非连通图,11,图的其他一些相关概念,子图: 对于 G=(V,E) , G =(V,E) 如果有 V in V & E in E, 则称G为G的子图。 带权图(网络): 每条边加上权值信息。带权图也常被称为加权图。带权图中的路径通常定义为路径之上所有边的权值总和。,B,A,C,D,6,3,2,1,5,4,12,ADT Graph is operations Graph createGraph (void) /创建一个空图 int isNullGraph (Graph g ) /判断图g是否空图 Vertex firstVertex (Graph g ) /找图中的一个顶点 Vertex nextVertex (Graph g , vi ) /找图中顶点vi的下一个连通顶点 Vertex searchVertex (Graph g , DataType value ) /查找图中值为value的顶点 Graph addVertex (Graph g , DataType value ) /在图g中增加一个值为value的顶点 int findEdge (Graph g , Vertex vi , Vertex vj ) /返回顶点v相关联的第一条、下一条边。 Vertex firstAdjacent (Graph g , Vertex v ) /*v与返回顶点构成的边也称为与v相关联的第一条边。*/ 找图g中与vi相邻的,相对相邻顶点vj的,下一个相邻顶点 Vertex nextAdjacent (Graph g , Vertex vi , Vertex vj ) /* vi与返回值构成的边也称为是vi与vj构成的边的下一条边。*/,图的操作与抽象数据类型,13,基于抽象数据类型的图的周游算法,图的周游是一种按某种方式系统地访问图中的所有结点的过程,它使每个结点都被且只被访问一次。图的周游也称图的遍历。 若图是连通(无向)图或强连通(有向)图,则从图中任意一顶点出发,都可以延某一路径找到图中所有顶点。否则就不然。 深度优先:类似于二叉树的深度优先。 广度优先:类似于二叉树的广度优先。,14,深度优先周游,先访问图中某个(未访问过的)结点V,然后选择一个V邻接到的未被访问过的结点W,再访问W,并按同样方法前进; 当遇到一个所有邻接于它的结点都被访问过了的结点时,退回到已访问结点序列中最后个拥有相邻结点未被访问过的结点,访问它的一个未被访问过的相邻结点U,再从U出发按同样方法前进。 当所有已被访问过的结点的相邻结点都被访问时,如果图中还有未被访问的顶点,则从另一未被访问过的顶点出发重复上述过程,直到图中所有顶点都被访问过时,周游结束。,。,15,深度优先周游算法,从顶点v0出发进行深度优先周游,得到的一个DFS序列为 v0,v1,v3,v7,v4,v2,v5,v6,int marked8;,16,深度优先周游算法,需要对已访问的顶点作标记。 在顶点中增设一个标记字段mark。 需要用到栈结构或采用递归算法。 从一个顶点出发的搜索不一定能够访问到图中所有顶点。,17,从节点v出发,dfs(g , v),void dfs ( Graph g , Vertex v ) Vertex v1; v.mark = TRUE ; /标记字段mark for ( v1 = firstAdjacent ( g,v ); v1 != NULL; v1= nextAdjacent (g,v,v1) dfs ( g ,v1 ); /*递归调用*/ ,void dft ( Graph g ) Vertex v ; for ( v =firstVertex ( g ) ; v != NULL ; v = nextVertex ( g , v ) ) if ( v.mark = FALSE ) dfs ( g , v ) ; /尝试所有结点,图g不一定连通 ,18,广度优先周游,从图的某个(未访问过的)顶点v出发, 先访问顶点v(将其标记为已访问), 接着依次访问v的所有未访问过的相邻结点w1,w2,wx, 然后,再依次访问与w1,w2,wx邻接的所有未被访问过的顶点, 以此类推,直到所有已访问顶点的相邻结点都被访问过。 这时,如果图中还有未被访问过的顶点,则从某个未被访问过的顶点出发进行同样方法搜索,直到图中所有顶点都被访问过时,周游结束,19,广度优先周游算法,从顶点v0出发的一个BFS序列为v0, v1, v2, v3, v4, v5, v6, v7,queue,20,广度优先周游算法,1、每个顶点包含一个mark字段,在周游前所有顶点的mark字段均被置为FALSE,周游到该结点时将相应的mark字段改为TRUE。 2、在bft中调用函数bfs ( g , v ),从顶点v出发按广度优先周游g中能访问的各个顶点。 具体实现中使用一个队列q,队列元素的类型为Vertex。,21,广度优先算法的实现,void bfs ( Graph g , Vertex v ) Vertex v1, v2; Queue q = createEmptyQueue ( ); /* 队列元素的类型为Vertex */ enQueue ( q ,v ) ; while ( !isEmptyQueue(q) ) v1 =frontQueue ( q ) ; deQueue ( q ); /get a node from queue v1.mark = TRUE ; /set start from mark v2 = firstAdjacent ( g ,v1 ); /get nodes, enQueue while ( v2!=NULL ) if ( v2.mark = FALSE ) enQueue ( q, v2 ); v2 = nextAdjacent ( g , v1 , v2 ) ; ,22,图的深度优先周游算法(续),/*图的深度优先周游算法*/ void dft ( Graph g ) Vertex v ; for ( v =firstVertex ( g ) ; v != NULL ; v = nextVertex ( g , v ) ) if ( v.mark = FALSE ) dfs ( g , v ) ; /*因为图g不一定连通*/ ,23,图的存储结构1 邻接矩阵表示法,设图 G = (V,E) G = (V,E)是一个有 是一个有 n个顶点的图 , 图的邻接矩阵是一个二维数组 edgenn,定义:,24,vexs1=a, b, c, d ; vexs2=v0,v1,v2,v3,v4,假定不存在 指向自身的弧,25,邻接矩阵表示法的特点,(1)无向图的关系矩阵一定是一对称矩阵。 (2)无向图的关系矩阵的第i行(或第i列)非零元素个数为第i个顶点的度D(vi)。 (3) 有向图的关系矩阵的第i行非零元素个数为第i个顶点的出度OD(vi),第i列非零元素个数就是第i个顶点的入度ID(vi)。 (4) 从图的邻接矩阵表示,很容易确定图中任意两个顶点之间是否有边相连。添加或删除边也很方便。,26,如果G是带权的图,wij是边(vi,vj)或的权,则其关系矩阵定义为,带权图的邻接矩阵表示,27,邻接矩阵表示法结构定义,typedef char VexType; typedef float AdjType; typedef struct int n; /* 图的顶点个数 */ VexType *vexs; /* 顶点信息 */ AdjType *arcs ; /* 边信息,二维数组 */ GraphMatrix;,28,邻接表表示法 对图中每个顶点建立一个单链表, 第i个单链表中的结点表示依附于该顶点Vi的边(或弧),29,struct EdgeNode; typedef struct EdgeNode * PEdgeNode; /edgeNode的指针 typedef struct EdgeNode * EdgeList; /edgeNode 链表指针 struct EdgeNode int endvex; /* 相邻顶点在顶点表中下标 */ AdjType weight; /* 边的权,非带权图应该省略 */ PEdgeNode nextedge; /* 链字段 */ ; /* 边表中的结点 */ typedef struct VexType vertex; /* 顶点信息 */ EdgeList edgelist; /* 边表头指针 */ VexNode; /* 顶点表中的结点 */ typedef struct int n; /* 图的顶点个数 */ VexNode *vexs; /*顶点表 */ GraphList; /* 图的邻接表表示 */,邻接表表示法结构定义,30,visited,非递归深度优先周游算法,stack,31,矩阵两种存储表示的空间开销比较,设图G有n个顶点,e条边. 图的邻接矩阵表示的空间代价为O(n2); 若图G是无向图, 则图的邻接表表示的空间代价为O(n+2e); 若图G是有向图, 则图的邻接表表示的空间代价为O(n+e); 若图中en2,则用邻接表表示图比较节省空间, 如果e达到n2数量级时,由于邻接表中增加了辅助的链域,采用邻接矩阵表示图更节省空间。 特别对于无权图而言,关系矩阵的每个元素实际上只要一个二进制位就可以表示。,32,图的生成树,基本概念: 针对对象-连通的无向图或强连通的有向图 对于连通的无向图,从任一顶点出发,可以访问到所有的顶点。周游时经过的边加上所有顶点构成了图的一个连通子图,称为图的一个生成树。 它含有图中的全部n个顶点,但只有足以构成一棵树的n-1条边,是连通图的一个极小连通子图。,33,构造生成树(例子),从无向图G7的顶点v0出发分别进行深度优先周游和广度优先周游,得到的DFS及BFS生成树右图所示。,34,最小生成树及其性质,网络(带权图)的生成树中生成树各边的权值加起来称为生成树的权,把权值最小的生成树称为最小生成树(Minimum Spanning Tree,简称为MST)。 等价与许多实际问题: 在n个城市小区之间供水网络,如何在最节省经费的前提下建立这个供水网?其中小区以及供水厂之间的距离为权重。,35,设G=(V,E)是一个网络,U是顶点集合V的一个真子集。 如果uU,vV-U,且边(u,v)是图G中所有一个端点在U里,另一端点在V-U里的边中权值最小的边, 则一定存在G的一棵最小生成树包括此边(u,v)。,MST性质,36,MST性质证明(反证法),u,u,v,v,U,V-U,v,v,边(u,v)是图G中所有一个端点在U里,另一端点在V-U里的边中权值最小的边。 假设:存在G的一棵最小生成树不包括此边。,37,Prim算法,prim算法的基本思想是 首先从集合V中任取一顶点(例如取顶点v0)放入集合U中这时U=v0,TE=NULL 然后在所有一个顶点在集合U里,另一个顶点在集合V-U里的边中,找出权值最小的边(u,v)(uU,vV-U),将边加入TE,并将顶点v加入集合U 重复上述操作直到U=V为止。这时TE中有n-1条边,T=(U,TE)就是G的一棵最小生成树,38,最小生成树的构造,准备工作: 设图采用邻接矩阵表示法表示,用一对顶点的下标(在顶点表中的下标)表示一条边,定义如下 在构造最小生成树的过程中定义一个类型为Edge的数组 mstEdge mstn-1; 其中n为网络中顶点的个数,算法结束时,mst中存放求出的最小生成树的n-1条边。,typedef struct int start_vex, stop_vex;/* 边的起点和终点 */ AdjType weight; /* 边的权 */ Edge;,39,例子,已知带权图G及其邻接矩阵如图所示 请构造该图的最小生成树,40,n=6,只有顶点v0在最小生成树中。 mst5=0,1,10, 0,2, 0,3, 0,4,19, 0,5,21 在mst0到mst4中找出权值最小的边mst0,即(v0, v1),将顶点v1及边(v0, v1)加入最小生成树。,1,n -1,41,n=6,只有顶点v0在最小生成树中。 mst5=0,1,10, 0,2, 0,3, 0,4,19, 0,5,21 在mst0到mst4中找出权值最小的边mst0,即(v0, v1),将顶点v1及边(v0, v1)加入最小生成树。 调整: mst5=0,1,10, 1,2,5, 1,3,6, 0,4,19, 1,5,11 ,2,n -2,42,mst5=0,1,10, 1,2,5, 1,3,6, 3,4,18, 1,5,11 mst5=0,1,10, 1,2,5, 1,3,6, 3,4,18, 1,5,11 ,3,n -3,43,mst5=0,1,10, 1,2,5, 1,3,6, 1,5,11 , 3,4,18,44,44,Prim算法时间复杂度,Prim算法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论