数据结构图.ppt
《数据结构图.ppt》由会员分享,可在线阅读,更多相关《数据结构图.ppt(154页珍藏版)》请在课桌文档上搜索。
1、1,第七章 图,2,7.1 抽象数据类型图的定义,7.2 图的存储表示,7.3 图的遍历,7.4 图的连通性问题,7.5 重(双)连通图和关节点,7.6 两点之间的最短路径问题,7.7 拓扑排序,7.8 关键路径,3,图是由一个顶点集 V 和一个弧集 R构成的数据结构。Graph=(V,R)其中,VR|v,wV 且 P(v,w)表示从 v 到 w 的一条弧,并称 v 为弧头,w 为弧尾。谓词 P(v,w)定义了弧 的意义或信息。,图的结构定义:,4,由于“弧”是有方向的,因此称由顶点集和弧集构成的图为有向图。,例如:,G1=(V1,VR1),其中V1=A,B,C,D,EVR1=,5,若VR 必
2、有VR,则称(v,w)为顶点 v 和顶点 w 之间存在一条边。,由顶点集和边集构成的图称作无向图。,例如:G2=(V2,VR2)V2=A,B,C,D,E,FVR2=(A,B),(A,E),(B,E),(C,D),(D,F),(B,F),(C,F),6,名词和术语,网、子图,完全图、稀疏图、稠密图,邻接点、度、入度、出度,路径、路径长度、简单路径、简单回路,连通图、连通分量、强连通图、强连通分量,生成树、生成森林,7,B,设图G=(V,VR)和图 G=(V,VR),且 VV,VRVR,则称 G 为 G 的子图。,15,9,7,21,11,3,2,弧或边带权的图分别称作有向网或无向网。,8,假设图
3、中有 n 个顶点,e 条边,则,含有 e=n(n-1)/2 条边的无向图称作完全图;,含有 e=n(n-1)条弧的有向图称作 有向完全图;,若边或弧的个数 enlogn,则称作稀疏图,否则称作稠密图。,9,假若顶点v 和顶点w 之间存在一条边,则称顶点v 和w 互为邻接点,,例如:,ID(B)=3,ID(A)=2,边(v,w)和顶点v 和w 相关联。和顶点v 关联的边的数目定义为边的度。,右侧图中,10,顶点的出度:以顶点v 为弧尾的弧的数目;,对有向图来说,,顶点的入度:以顶点v为弧头的弧的数目。,顶点的度(TD)=出度(OD)+入度(ID),例如:,ID(B)=2,OD(B)=1,TD(B
4、)=3,由于弧有方向性,则有入度和出度之分,11,设图G=(V,VR)中的一个顶点序列 u=vi,0,vi,1,vi,m=w中,(vi,j-1,vi,j)VR 1jm,则称从顶点u 到顶点w 之间存在一条路径。路径上边的数目称作路径长度。,如:从A到F长度为 3 的路径A,B,C,F,简单路径:指序列中顶点不重复出现的路径。,简单回路:指序列中第一个顶点和最后一个顶点相同的路径。,12,若图G中任意两个顶点之间都有路径相通,则称此图为连通图;,若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。,13,14,所谓极大是指连通分量中顶点数最多,再添加任何一个顶点就会使之变为非连通图。,
5、15,v2,16,若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图。,对有向图,,否则,其各个强连通子图称作它的强连通分量。,17,假设一个连通图有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。,对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。,18,所谓极小是指连通分量中边数最少,若在生成树中去掉任何一条边都会使之变为非连通图,若在生成数上任意添加一条边,就必会出现回路。,19,20,21,结构的建立和销毁,插入或删除顶点,对邻接点的操作,对顶点的访问操作,遍历,插入和删除弧,基本操作:,2
6、2,CreatGraph(&G,V,VR):/按定义(V,VR)构造图,DestroyGraph(&G):/销毁图,结构的建立和销毁,23,对顶点的访问操作,LocateVex(G,u);/若G中存在顶点u,则返回该顶点在/图中“位置”;否则返回其它信息。,GetVex(G,v);/返回 v 的值。,PutVex(/对 v 赋值value。,24,对邻接点的操作,FirstAdjVex(G,v);/返回 v 的“第一个邻接点”。/若该顶点在 G 中没有邻接点,则返回“空”。,NextAdjVex(G,v,w);/返回 v 的(相对于 w 的)“下一个邻接点”。/若 w 是 v 的最后一个邻接点
7、,则返回“空”。,25,插入或删除顶点,InsertVex(/在图G中增添新顶点v。,DeleteVex(/删除G中顶点v及其相关的弧。,26,插入和删除弧,InsertArc(/在G中增添弧,若G是无向的,/则还增添对称弧。,DeleteArc(/在G中删除弧,若G是无向的,/则还删除对称弧。,27,遍 历,DFSTraverse(G,v,Visit();/从顶点v起深度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次。,BFSTraverse(G,v,Visit();/从顶点v起广度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次。,28,7.2 图的存储表示,一、图的数组
8、(邻接矩阵)存储表示,二、图的邻接表存储表示,三、有向图的十字链表存储表示,四、无向图的邻接多重表存储表示,29,一、图的数组(邻接矩阵)存储表示,定义:矩阵的元素为,对称矩阵,30,网的邻接矩阵可以定义为:,其中wij为权值,31,有向图中,顶点vi的入度是邻接矩阵中第i列的元素之和,顶点vi的出度是邻接矩阵中第i行的元素之和。,有向图的邻接矩阵的特点?,32,33,图的邻接矩阵表示法的特点:无向图的邻接矩阵是一个对称矩阵。无向图中,顶点vi的度是邻接矩阵中第i行(或第i列)的元素之和;有向图中,顶点vi的入度是邻接矩阵中第i列的元素之和,顶点vi的出度是邻接矩阵中第i行的元素之和。若邻接矩
9、阵中元素aij的值为1,则vi和vj之间有边或弧相连。图G的邻接矩阵的空间复杂度为O(n2),只与顶点数n有关,与边数无关,适合于表示稠密图。,34,typedef struct ArcCell/弧的定义 VRType adj;/VRType是顶点关系类型。/对无权图,用1或0表示相邻否;/对带权图,则为权值类型。InfoType*info;/该弧相关信息的指针 ArcCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;,35,typedef struct/图的定义 VertexType vexsMAX_VERTEX_NUM;/顶点信息 AdjMatrix a
10、rcs;/弧的信息 int vexnum,arcnum;/顶点数,弧数 GraphKind kind;/图的种类标志 MGraph;,Typedef enumDG,DN,AG,ANGraphKind/有向图,有向网,无向图,无向网,36,无向图的邻接表的特点?,在无向图的邻接表中第i个链表中结点的个数即为第i个顶点的度,二、图的邻接表存储表示,37,有向图的邻接表,有向图的邻接表的特点?,在有向图的邻接表中第i个链表中结点的个数即为第i个顶点的出度,38,有向图的逆邻接表,有向图的逆邻接表的特点?,在有向图的逆邻接表中第i个链表中结点的个数即为第i个顶点的入度,39,typedef struc
11、t ArcNode int adjvex;/该弧所指向的顶点的位置 struct ArcNode*nextarc;/指向下一条弧的指针 InfoType*info;/该弧相关信息的指针 ArcNode;,adjvex nextarc info,弧的结点结构,40,typedef struct VNode VertexType data;/顶点信息 ArcNode*firstarc;/指向第一条依附该顶点的弧 VNode,AdjListMAX_VERTEX_NUM;,data firstarc,顶点的结点结构,41,typedef struct AdjList vertices;int vexn
12、um,arcnum;int kind;/图的种类标志 ALGraph;,图的结构定义(邻接表),42,0 1 2,三、有向图的十字链表存储表示,43,弧结点,顶点结点,顶点信息,指向以该顶点为弧头的第一个弧结点,指向以该顶点为弧尾的第一个弧结点,三、有向图的十字链表存储表示,44,45,弧的结点结构,弧尾顶点位置 弧头顶点位置 弧的相关信息,指向下一个有相同弧尾的结点,指向下一个有相同弧头的结点,typedef struct ArcBox/弧的结构表示 int tailvex,headvex;InfoType*info;struct ArcBox*hlink,*tlink;VexNode;,t
13、ailvex,headvex,hlink,tlink,info,46,顶点的结点结构,指向该顶点的第一条入弧,指向该顶点的第一条出弧,typedef struct VexNode/顶点的结构表示 VertexType data;ArcBox*firstin,*firstout;VexNode;,data,firstin,firstout,47,typedef struct VexNode xlistMAX_VERTEX_NUM;/顶点结点(表头向量)int vexnum,arcnum;/有向图的当前顶点数和弧数 OLGraph;,有向图的结构表示(十字链表),48,课堂练习:画出右图所示有向图
14、的十字链表,49,邻接多重表,边结点,顶点结点,顶点信息,指示第一条依附于该顶点的边,分别指示该边所依附的两个顶点在图中的位置,分别指示下一条依附域顶点ivex或jvex的边,50,51,课堂练习:画出下面的无向图的邻接多重表,52,53,7.3 图的遍历,从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。,深度优先搜索,广度优先搜索,遍历应用举例,54,从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。,一、深度优先搜索遍历图,连通图的深度优先搜索遍历,55,深度优
15、先遍历基本思想:假设初始状态是图中所有顶点未曾被访问,则深度优先遍历可以从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接到出发深度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到为止。,56,从v1出发进行深度优先遍历所得到的遍历序列为:,v7,v5,v6,v2,v3,v1,v4,v8,v1,v2,v4,v5,v8,v3,v7,v6,深度优先遍历序列或DFS序列,57,深度遍历:V1,V3,V7,V6,V2,V5,V8,V4,58,深度遍历:V1,V3,V7,V6
16、,V2,V4,V8,V5,59,算法思想:(1)访问出发点vi,并将其标记为已访问过。(2)遍历vi的的每一个邻接点vj,若vj未曾访问过,则以vj为新的出发点继续进行深度优先遍历。,60,void DFS(Graph G,int v)/从顶点v出发,深度优先搜索遍历连通图 G visitedv=TRUE;VisitFunc(v);for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w)if(!visitedw)DFS(G,w);/对v的尚未访问的邻接顶点w/递归调用DFS/DFS,61,首先将图中每个顶点的访问标志设为 FALSE,之后搜索图中每个顶点,
17、如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。,非连通图的深度优先搜索遍历,62,void DFSTraverse(Graph G,Status(*Visit)(int v)/对图 G 作深度优先遍历。VisitFunc=Visit;for(v=0;vG.vexnum;+v)visitedv=FALSE;/访问标志数组初始化 for(v=0;vG.vexnum;+v)if(!visitedv)DFS(G,v);/对尚未访问的顶点调用DFS,63,F F F F F F F F F,0 1 2 3 4 5 6 7 8,T,T,T,T,T,T,T,T,T,a,c,h
18、,d,k,f,e,b,g,a,c,h,k,f,e,d,b,g,访问标志:,访问次序:,例如:,a,c,h,d,k,f,e,64,基本思想:假设初始状态是图中所有顶点未曾被访问,则广度优先遍历可以从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到为止。,二、广度优先搜索遍历图,65,从v1出发进行广度优先遍历
19、所得到的遍历序列为:,v7,v5,v6,v2,v3,v1,v4,v8,v1,v2,v3,v5,v4,v6,v8,v7,广度优先遍历序列或BFS序列,66,67,算法思想:(1)访问出发点v,并将其标记为已访问过;(2)顶点v入队;(3)while(队不空)取队首顶点i;依次搜索顶点i的所有邻接点,若某一邻接点 j未被访问,则访问该邻接点,并将其入队,68,void BFSTraverse(Graph G,Status(*Visit)(int v)for(v=0;vG.vexnum;+v)visitedv=FALSE;/初始化访问标志 InitQueue(Q);/置空的辅助队列Q for(v=0
20、;vG.vexnum;+v)if(!visitedv)/v 尚未访问/BFSTraverse,69,visitedv=TRUE;Visit(v);/访问uEnQueue(Q,v);/v入队列while(!QueueEmpty(Q)DeQueue(Q,u);/队头元素出队并置为u for(w=FirstAdjVex(G,u);w!=0;w=NextAdjVex(G,u,w)if(!visitedw)visitedw=TRUE;Visit(w);EnQueue(Q,w);/访问的顶点w入队列/if/while,70,无向图的连通分量和生成树,对无向图进行遍历时,对于连通图,从图中任一顶点出发,进行
21、深度优先遍历或广度优先遍历,就可以访问图中所有顶点。对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个起始点出发进行搜索过程中得到的顶点访问序列恰好为其各个连通分量中的顶点集。,7.4 图的连通性问题,71,在两种遍历方法中,从一个已访问过的顶点vi搜索到一个未曾访问过的邻接点vj,必定要经过图中的一条边(vi,vj);而这两种方法对图中的n个顶点都仅访问过一次,除初始点外,对其余n-1个顶点的访问一共要经过图中的n-1条边,这n-1条边将图中的n个顶点连接成图的极小连通子图,它是图的一棵生成树。初始出发点则是生成树的根。,72,通常由深度优先遍历得到的生成树称为深度优先生成树,简称DF
22、S生成树;由广度优先遍历得到的生成树称为深度优先生成树,简称BFS生成树对于非连通的无向图,所有连通分量的生成树组成了非连通图的生成森林。,73,v1,深度优先生成树,74,广度优先生成树,75,有向图的强连通分量,对有向图进行深度优先遍历,可以得到有向图的一个强连通分量。求有向图强连通分量基本步骤:从某个顶点出发,沿以该顶点为尾的弧进行深度优先遍历,并按其所有邻接点的遍历都完成的顺序将顶点排列起来。从最后完成遍历的顶点出发,沿着以该顶点为头的弧作逆向的深度优先遍历。若此次遍历不能访问图中所有顶点,则从余下的顶点中继续作逆向的深度优先遍历,直到所有顶点都被访问到为止。每一次调用逆向深度优先遍历
23、所访问的顶点集便是有向图的一个强连通分量。,76,B,D,C,A,77,一个具有n个顶点的连通图的生成树是原图的一个极小连通子图,它含有原图中的所有n个顶点,并且具有保持连通图的最少的边。,最小生成树,问题提出 假设要在n个城市之间建立通信联络网,如何在最节省经费的前提下建立这个通信网呢?,78,网中的顶点表示城市,边表示两城市之间的线路,边上的权值表示相应的代价。,79,连通n个城市只需要n-1条线路。该问题就是构造连通网的最小代价生成树(简称最小生成树)的问题。一棵生成树的代价就是树上各边的代价之和。如何构造最小生成树?,构造最小生成树有两种典型方法:普里姆(Prim)算法克鲁斯卡尔(Kr
24、uskal)算法,80,MST性质,假设N(V,E)是一个联通网,U是顶点集V 的一个非空子集。若(u,v)是一条具有最小代价的边,其中uU、v V。则必存在一棵包含边(u,v)的最小生成树。,81,基本思想假设N=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是所求的最小生成树,其中U是T的顶点集,TE是T的边集。算法从U=u0(u0V),TE=开始重复执行以下操作:在所有uV,vV-U的边(u,v)E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中必有n-1条边,则T为N的最小生成树。,普里姆(Prim)算法,82,例:从顶点v1出发,利用
25、Prim算法构造下面连通网的最小生成树。,83,v7,v5,v6,v2,v3,v1,v4,60,45,50,50,65,42,40,50,30,70,v1,84,为了实现算法,需设置一个辅助数组closedge,记录从U到V-U具有最小代价的边。其包含两个分量:lowcost:存放U顶点中顶点到V-U集合中各顶点的各边上的当前最小权值;adjvex:记录当前最小权值的边依附在U中的顶点。,struct VertexType adjvex;/U集中的顶点序号 VRType lowcost;/边的权值 closedgeMAX_VERTEX_NUM;,85,例如:,a,e,d,c,b,g,f,14,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构图
链接地址:https://www.desk33.com/p-229777.html