数据结构图结构(动态PPT).ppt
《数据结构图结构(动态PPT).ppt》由会员分享,可在线阅读,更多相关《数据结构图结构(动态PPT).ppt(141页珍藏版)》请在课桌文档上搜索。
1、1,本章主要介绍图的基本概念、图的存储结构和有关图的一些常用算法。通过本章学习,读者应该:1)了解图的定义和术语 2)掌握图的各种存储结构 3)掌握图的深度优先搜索和广度优先搜索遍历算法 4)理解最小生成树、最短路径、拓扑排序、关键路径等图的常用算法,本章学习导读,2,图(Graph)是一种较线性表和树更为复杂的非线性结构。在线性结构中,结点之间的关系是线性关系,除开始结点和终端结点外,每个结点只有一个直接前趋和直接后继。在树形结构中,结点之间的关系实质上是层次关系,同层上的每个结点可以和下一层的零个或多个结点(即孩子)相关,但只能和上一层的一个结点(即双亲)相关(根结点除外)。然而在图形结构
2、中,对结点(图中常称为顶点)的前趋和后继个数都是不加限制的,即结点之间的关系是任意的。图中任意两个结点之间都可能相关。图的应用极为广泛,特别是近年来的迅速发展,已渗透到诸如语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学的其它分支中。,3,7.1 图的定义 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径,第七章 图,4,图定义 图G由两个集合V和E组成,记为 G=(V,E)其中,V是顶点的有穷非空集合,E是V中顶点偶对的有穷集,这些顶点偶对称为边。通常V(G)和E(G)分别称为图的顶点集合和边集合。注:E(G)可以为空集。,
3、7.1 图的定义和术语,5,7.1 图的定义和术语,图的数据结构的形式化定义(p156),G=(V,E)其中 V=x|x dataobject E=VR VR=|p(x,y)(x,y V)VR是两顶点间的关系的集合,即边的集合。,6,图的术语,有向图:对一个图G,若边集E(G)为有向边的集合,则称该图为有向图。,G1=(V,E)V=v1,v2,v3,v4E=,其中表示从x到y的一条弧(arc),A为弧集合,x为弧尾(tail),y为弧头(head),x弧尾,y弧头,7,图的术语,无向图:对一个图G,若边集E(G)为无向边的集合,则称该图为无向图。,G2=(V,E)V=v1,v2,v3,v4,v
4、5E=(v1,v2),(v1,v3),(v2,v3),(v3,v4),(v2,v5),(v3,v5)其中,(x,y)表示x与y之间的一条连线,称为边(edge),8,图的术语,设n为顶点数,e为边或弧的条数 对无向图有:0 e n(n-1)/2 有向图有:0 e n(n-1),证明:对有向图,每个顶点至多有n-1条边与其它的n-1个顶点相连,则n个顶点至多有n(n-1)条边。但对无向图,每条边连接2个顶点,故最多为n(n-1)/2,9,图的术语,端点和邻接点 在一个无向图中,若存在一条边,则称vi,vj为该边的两个端点,并称它们互为邻结点。,10,图的术语,起点和终点 在一个有向图中,若存在一
5、条边,则称该边是顶点vi的一条出边,是vj的一条入边,称vi是起始端点(或起点),称vj是终止端点(或终点),并称它们互为邻结点.,11,图的术语,度 图中每个顶点的度是以该顶点为一端点的边的数目。记为 D(V)。入度和出度 对于有向图,入度为以该顶点为终点的边的数目,出度为以该顶点为起点的边的数目。,例 D(v1)=3,无向图的度数为依附于顶点v的边数;有向图的度数等于以顶点v 为弧头的弧数与以顶点v为弧尾的弧数之和,例 D(v1)=2,12,图的术语,子图 设有两个图G=(V,E)G=(V,E)中,若V是V的子集,E是E的子集,则称G是G子图。,13,图的术语,简单图 对不含多重边和自环的
6、图。,简单图,非简单图,14,图的术语,完全图 边达到最大的图,无向完全图:具有n(n-1)/2条边的简单图称为无向完全图 有向完全图:具有n(n-1)条边的有向图。稀疏图:边或弧很少的图。稠密图:边或弧很多的图。权:与图的边或弧相关的数。网:边或弧上带有权值的图。,15,图的术语,路径 非空有限点、弧交替序列,W=v0,a1,v1,ak,vk 使得i=1,2,k,弧ai的头vi,尾为vi-1。,路径长度:路径上边或弧的数目,16,图的术语,简单路径:除首尾两点外,其他各点都不相同的路径称为简单路径。,简单路径,17,图的术语,回路:无重复边的闭路径。,环:闭的简单路径,称为环。,回路但不是环
7、,环,18,图的术语,连通图:任何两点都有路径的图。无向图:若图中任意两个顶点vi,vj都是连通 的,则称该图是连通图(vivj)有向图:若图中任意两个顶点vi,vj,都存在 从vi到vj 和从 vj到vi的路径,则称 该有向图为强连通图(vivj),19,图的术语,连通分量:无向图:无向图中极大连通子图,称为 连通分量 有向图:有向图中极大强连通子图,称为 强连通分量,20,生成树,图的术语,生成树 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。,有向树 如果一个有向图恰有一个顶点入度为0,其余顶点的入度均为1,则是一棵有向树。,21,生成树、生
8、成森林生成树 一个连通图的生成树是它的极小连通子图,在n个顶点的情形下,有n-1条边。生成树是对连通图而言的 是连通图的极小连通子图 包含图中的所有顶点 有且仅有n-1条边 非连通图的生成树则组成一个生成森林。若图中有n个顶点,m个连通分量,则生成森林中有n-m条边。,一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。,22,图有两种存储结构 邻接矩阵 邻接表,7.2 图的存储结构,23,7.2.1 邻接矩阵 邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。设G(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的
9、n阶方阵。,7.2 图的存储结构,无向图的邻接矩阵是以主对角线对称的,有向图的邻接矩阵可能是不对称的。在有向图中:第 i 行 1 的个数就是顶点 i 的出度,第 j 列 1 的个数就是顶点 j 的入度。在无向图中,第 i 行(列)1 的个数就是顶点i 的度。,24,一、邻接矩阵(用二维数组表示),例如:G1的邻接矩阵,例如:G2的邻接矩阵,无向图的邻接矩阵为对称矩阵,25,对于无向图,(vi,vj)和(vj,vi)表示同一条边,因此,在邻接矩阵中Aij=Aji。无向图的邻接矩阵是(关于主对角线)对称矩阵,可用主对角线以上(或以下)的部分表示。对有向图,弧和表示方向不同的两条弧,Aij和Aji表
10、示不同的弧,所以有向图的邻接矩阵一般不具有对称性。邻接矩阵表示法适合于以顶点为主的运算。,26,对于有向图,顶点vi的出度OD(vi)等于邻接矩阵第i行元素之和;顶点vi的入度ID(vi)等于邻接矩阵第i列元素之和,即:,对于无向图,顶点vi的度等于邻接矩阵第i行的元素之和,即:,OD(vi)=,ID(vi)=,TD(vi)=,27,若G是网(有权图),邻接矩阵定义为,如图:,Wij 若 或 E(G)A i,j=0或 若其它,28,顶点表:一个记录各个顶点信息的一维数组,邻接矩阵:一个表示各个顶点之间的关系(边或弧)的二维数组。使用邻接矩阵存储结构,可用一维数组表示图的顶点集合,用二维数组表示
11、图的顶点之间关系(边或弧)的集合,数据类型定义如下:#define MAX_VERTEX_NUM 20/最大顶点数typedef int AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;/邻接矩阵类型typedef struct VertexType vexsMAX_VERTEX_NUM;/顶点表AdjMatrix arcs;/邻接矩阵int vexnum,arcnum;/图的顶点数和弧数 MGraph;由于一般图的边或弧较少,其邻接矩阵的非零元素较少,属稀疏矩阵,因此会造成一定存储空间的浪费。,29,7.2.2 邻接表 图的链式存储结构 1)为每个顶点建立一个单链
12、表,2)第i个单链表中包含顶点Vi的所有邻接顶点。邻接表是图的一种链式存储结构。类似于树的孩子链表表示法。在邻接表中为图中每个顶点建立一个单链表,用单链表中的一个结点表示依附于该顶点的一条边(或表示以该顶点为弧尾的一条弧),称为边(或弧)结点。,30,1.无向图邻接表,31,2.有向图邻接表,如图G1的邻接表为:,32,在邻接表的边链表中,各个边结点的链入顺序任意,视边结点输入次序而定。设图中有 n 个顶点,e 条边,则用邻接表表示无向图时,需要 n 个顶点结点,2e 个边结点;用邻接表表示有向图时,若不考虑逆邻接表,只需 n 个顶点结点,e 个边结点。建立邻接表的时间复杂度为O(n*e)。若
13、顶点信息即为顶点的下标,则时间复杂度为O(n+e)。,33,存储表示typedef struct ArcNodeint adjvex;/该弧所指向的顶点的位置struct ArcNode*nextarc;/指向下一条弧的指针 int*info;/该弧相关信息的指针 ArcNode;/边结点类型typedef struct VNodeVertexType data;/顶点信息ArcNode*firstarc;/指向第一条依附该顶点的弧的指针VNode,AdjListMAX_VERTEX_NUM;/邻接表typedef structAdjList vertices;int vexnum,arcnu
14、m;/图的当前顶点数和弧数 int kind;/图的种类标志ALGraph;,34,1.无向图邻接表,二、邻接表,35,1.无向图邻接表,对图中每个顶点Vi建立一个单链表,链表中的结点表示依附于顶点Vi的边,每个链表结点为两个域.,其中:邻接点域(adjvex)记载与顶点Vi邻接的顶点信息;链域(nextarc)指向下一个与顶点Vi邻接的链表p结点,每个链表设一个头结点,头结点结构为:,其中:vexdata存放顶点信息(姓名、编号等);firstarc指向链表的第一个结点。,二、邻接表,36,二、邻接表(adjacency list),如图G2的邻接表为:,37,B,A,C,D,F,E,例 2
15、,38,2.有向图邻接表,特点:1.n个顶点,e条弧的有向图,需n个表头结点,e 个表结点 2.第 i 条链表上的结点数,为 Vi 的出度(求顶点的出度易,求入度难),如图G1的邻接表为:,39,1 4,2,3,0 1,2,0 1 2 3 4,A B C D E,2.有向图的邻接表,A,B,E,C,F,可见,在有向图的邻接表中不易找到指向该顶点的弧。,40,3.有向图逆邻接表,此时,第i条链表上的结点数,为Vi的入度,如图G1的逆邻接表为:,G1,41,A,B,E,C,D,有向图的逆邻接表,A B C D E,3,0,3,4,2,0,01234,在有向图的邻接表中,对每个顶点,链接的是指向该顶
16、点的弧。,在有向图的邻接表中,第 i 个链表中结点的个数是顶点Vi的出度。在有向图的逆邻接表中,第 i 个链表中结点的个数是顶点Vi 的入度。,42,4.带权有向图的邻接表,链表中每个结点为三个域.,带权图的边结点中info保存该边上的权值。,43,A,B,E,C,D,4.带权有向图的邻接表,01234,10,2,25,4,8,3,7,顶点 Vi 的边链表的头结点存放在下标为 i 的顶点数组中。,44,7.2.3 十字链表 十字链表(Orthogonal List)是有向图的另一种链式存储结构。可看作是将有向图的邻接表和逆邻接表结合的一种链表。在十字链表中,为每个顶点vi设置一个结点,它包含数
17、据域data和两个链域firstout、firstin,称为顶点结点。数据域data用于存放顶点vi的有关信息;链域firstin指向以顶点vi为弧头的第一个弧结点;链域firstout指向以顶点vi为弧尾的第一个弧结点。弧结点包括四个域:尾域tailvex、头域headvex,链域hlink和tlink。hlink指向弧头相同的下一条弧,tlink指向弧尾相同的下一条弧;data顶点信息,firstin以该顶点为头的第一个弧结点,firstout以该结点为尾的第一个弧结点。,弧结构,顶点结构,45,图7-8 十字链表,图7-8为图7-6(a)有向图的十字链表。见右图,采用十字链表表示有向图,
18、很容易找到以顶点vi为弧尾的弧和以顶点vi为弧头的弧,因此顶点的出度、入度都很容易求得。,46,十字链表的数据类型定义如下:#define MAXV typedef struct Arcbox/弧结点 int tailvex,headvex;/弧尾和弧头顶点位置 struct ArcNode*hlink,*tlink;/弧头相同和弧尾相同的弧的链域ArcBox;typedef struct VexNode/顶点结点 VertexType data;/顶点信息 ArcNode*firstin,*firstout;/分别指向该顶点的第一条入弧和出弧VexNode;,47,7.2.4 邻接多重表 邻
19、接多重表是无向图的另一种链式存储结构。在邻接多重表中设置一个边结点表示图中的一条边。边结点包含五个域,结构如下所示:,其中:mark 域 标志域,用于对该边进行标记;ivex 域 存放该边依附的一个顶点vi的位置信息;ilink 域 该链域指向依附于顶点vi的另一条边的边结点;jvex 域 存放该边依附的另一个顶点vj的位置信息;jlink 域 该链域指向依附于顶点vj的另一条边的边结点。邻接多重表为每个顶点设置一个结点,其结构如下:,48,图7-9 邻接多重表,图7-9为图7-5(a)无向图的邻接多重表。,由邻接多重表可以看出,表示边(vi,vj)的边结点通过链域ilink和jlink链入了
20、顶点vi和顶点vj的两个链表中,实现了用一个边结点表示一个边的目的,克服了在邻接表中用两个边结点表示一个边的缺点。因此邻接多重表是无向图的一种很有效的存储结构。,49,邻接多重表的结点数据类型定义如下:#define MAXV typedef struct/边结点类型 int mark;/访问标识 int ivex,jvex;/该边的两个顶点位置信息 struct Enode*ilink,*jlink;/分别指向依附这两个顶点的下一条边Enode;typedef struct/顶点结点类型 VertexType data;/顶点数据域 ENode*firstedge;/指向第一条依附该顶点的边
21、Vnode;,50,7.3 图的遍历,和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历。(Traversing Graph)。,图的遍历远比树的遍历复杂。因为从树根到达树的某个结点只有一条路径,而图的两个顶点之间可能有多条路径。,因此,在图的遍历过程中,可能会出现下面的现象,即在顺着一条路径访问了某个顶点后,可能会沿着另一条路径又回到该顶点。,为避免一个顶点被多次访问,我们设置一个标志数组int visitedMAX_VERTEX_NUM;它的元素初值为0。一旦vi被访问了,便置相应数组元素为1.,图的遍历方法有:,这两种方法对无向图和有向图都适用。
22、,51,7.3.1 深度优先搜索(DFS)1 深度优先搜索遍历过程:DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从w1出发,访问与 w1邻接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。,52,深度优先搜索的示例,图中可能存在回路,且图的任一顶点都可能
23、与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组 visited,它的初始状态为 0,在图的遍历过程中,一旦某一个顶点 i 被访问,就立即让 visited i 为 1,防止它被多次访问。,53,对上图,深度优先搜索遍历的顺序(之一)为:v1 v2v4 v8 v5v6v3v7。,图7-10 深度优先搜索,54,深度优先搜索算法:int visitedMAX_VERTEX_NUM;void DFS(ALGraph G,int v)ArcNode*p;printf(%c,G.verticesv.data);vi
24、sitedv=1;p=G.verticesv.firstarc;while(p)if(!visitedp-adjvex)DFS(G,p-adjvex);p=p-nextarc;/从第v个顶点出发DFS,55,整个图的DFS遍历void DFSTraverse(ALGraph G)for(int v=0;vG.vexnum;+v)visitedv=0;for(v=0;vG.vexnum;+v)if(!visitedv)DFS(G,v);对于连通图,从一个顶点出发,调用DFS函数即可将所有顶点都遍历到。,56,7.3.2 广度优先搜索(BFS)1 广度优先搜索思想 广度优先搜索遍历类似于树的按层次
25、遍历。对于无向连通图,广度优先搜索是从图的某个顶点v0出发,在访问v0之后,依次搜索访问v0的各个未被访问过的邻接点w1,w2,。然后顺序搜索访问w1的各未被访问过的邻接点,w2的各未被访问过的邻接点,。即从v0开始,由近至远,按层次依次访问与v0有路径相通且路径长度分别为1,2,的顶点,直至连通图中所有顶点都被访问一次。广度优先搜索的顺序不是唯一的,例如图7-10(a)连通图的广度优先搜索遍历顺序可为v1,v2,v3,v4,v5,v6,v7,v8 也可为v1,v3,v2,v7,v6,v5,v4,v8。,57,广度优先搜索在搜索访问一层时,需要记住已被访问的顶点,以便在访问下层顶点时,从已被访
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构图 结构 动态 PPT

链接地址:https://www.desk33.com/p-229818.html