数据结构[C][第07章.ppt
《数据结构[C][第07章.ppt》由会员分享,可在线阅读,更多相关《数据结构[C][第07章.ppt(105页珍藏版)》请在三一办公上搜索。
1、2023/11/14,1,第7章 图,本章学习内容,7.1 图的基本概念,7.2 图的存储结构,7.3 图的遍历,7.4 生成树和最小生成树,7.5 最短路径,7.6 有向无环图及其应用,2023/11/14,2,7.1.1 图的定义,7.1 图的基本概念,图是由顶点集V和顶点间的关系集合E(边的集合)组成的一种数据结构,可以用二元组定义为:G=(V,E)。,例如,对于图7-1所示的无向图G1和有向图G2,它们的数据结构可以描述为:G1=(V1,E1),其中V1=a,b,c,d,E1=(a,b)(a,c),(a,d),(b,d),(c,d),而G2=(V2,E2),其中V2=1,2,3,E2=
2、,。,(a)无向图G1(b)有向图G2 图7-1 无向图和有向图,2023/11/14,3,7.1.2 图的基本术语,1有向图和无向图,在图中,若用箭头标明了边是有方向性的,则称这样的图为有向图,否则称为无向图。图7-1中,G1为无向图,G2为有向图。,在无向图中,一条边(x,y)与(y,x)表示的结果相同,用圆括号表示,在有向图中,一条边与表示的结果不相同,故用尖括号表示。表示从顶点x发向顶点y的边,x为始点,y为终点。有向边也称为弧,x为弧尾,y为弧头,则表示为一条弧;而表示y为弧尾,x为弧头的另一条弧。,2023/11/14,4,2完全图、稠密图、稀疏图,具有n个顶点,n(n-1)/2条
3、边的图,称为完全无向图;具有n个顶点,n(n-1)条弧的有向图,称为完全有向图。完全无向图和完全有向图都称为完全图。,对于一般无向图,顶点数为n,边数为e,则0en(n-1)/2。,对于一般有向图,顶点数为n,弧数为e,则0en(n-1)。,当一个图接近完全图时,称它为稠密图,相反地,当一个图中含有较少的边或弧时,称它为稀疏图。,3度、入度、出度,在图中,一个顶点依附的边或弧的数目,称为该顶点的度。在有向图中,一个顶点依附的弧头数目,称为该顶点的入度;一个顶点依附的弧尾数目,称为该顶点的出度;某个顶点的入度和出度之和称为该顶点的度。,2023/11/14,5,另外,若图中有n个顶点,e条边或弧
4、,第i个顶点的度为di,则有e=。,例如,对图7-1,G1中顶点a,b,c,d的度分别为3,2,2,3,G2中顶点1,2,3的出度分别为2,1,1,而它们的入度分别为1,1,2,故顶点1,2,3的度分别为3,2,3。,4子图,若有两个图G1和G2,G1=(V1,E1),G2=(V2,E2),满足如下条件:V2V1,E2 E1,即V2为V1的子集,E2为E1的子集,称图G2为图G1的子图。,图和子图的示例具体见图7-2。,(a)图G(b)图G的两个子图 图7-2 图与子图示例,2023/11/14,6,5权,在图的边或弧中给出相关的数,称为权。权可以代表一个顶点到另一个顶点的距离、耗费等,带权图
5、一般称为网。,带权图的示例具体见图7-3。,(a)无向网(b)有向网 图7-3 无向带权图和有向带权图,2023/11/14,7,6连通图和强连通图,在无向图中,若从顶点i到顶点j有路径,则称顶点i到顶点j是连通的。若任意两个顶点都是连通的,则称此无向图为连通图,否则称为非连通图。,连通图和非连通图示例见图7-4。,(a)连通图,(b)非连通图,图7-4 连通图和非连通图,2023/11/14,8,在有向图中,若从顶点i到顶点j有路径,则称从顶点i到顶点j是连通的,若图中任意两个顶点都是连通的,则称此有向图为强连通图,否则称为非强连通图。,强连通图和非强连通图示例见图7-5。,(a)强连通图,
6、(b)非强连通图,图7-5 强连通图和非强连通图,2023/11/14,9,7连通分量和强连通分量,无向图中,极大的连通子图为该图的连通分量。显然,任何连通图的连通分量只有一个,即它本身,而非连通图有多个连通分量。,对于图7-4中的非连通图,它的连通分量见图7-6。,图7-6 图7-4(b)的连通分量,2023/11/14,10,有向图中,极大的强连通子图为该图的强连通分量。显然,任何强连通图的强连通分量只有一个,即它本身,而非强连通图有多个强连通分量。,对于图7-5中的非强连通图,它的强连通分量见图7-7。,图7-7 图7-5(b)的强连通分量,2023/11/14,11,8路径、回路,在无
7、向图G中,若存在一个顶点序列Vp,Vi1,Vi2,Vin,Vq,使得(Vp,Vi1),(Vi1,Vi2),(Vin,Vq)均属于E(G),则称顶点Vp到Vq存在一条路径。若一条路径上除起点和终点可以相同外,其余顶点均不相同,则称此路径为简单路径。起点和终点相同的路径称为回路,简单路径组成的回路称为简单回路。路径上经过的边的数目称为该路径的路径长度。,9有根图,在一个有向图中,若从顶点V有路径可以到达图中的其他所有顶点,则称此有向图为有根图,顶点V称做图的根。,10生成树、生成森林,连通图的生成树是一个极小连通子图,它包含图中全部n个顶点和n-1条不构成回路的边。非连通图的生成树则组成一个生成森
8、林。若图中有n个顶点,m个连通分量,则生成森林中有n-m条边。,2023/11/14,12,7.2 图的存储结构,由于图是一种多对多的非线性关系,因此,无法用数据元素在存储区中的物理位置来表示元素之间的关系,故不能用顺序存储结构。下面将介绍常用的三种存储结构:邻接矩阵、邻接表和邻接多重表。,7.2.1 邻接矩阵,1图的邻接矩阵表示,在邻接矩阵表示中,除了存放顶点本身的信息外,还用一个矩阵表示各个顶点之间的关系。若(i,j)E(G)或i,jE(G),则矩阵中第i行 第j列元素值为1,否则为0。,图的邻接矩阵定义为:,1 若(i,j)E(G)或i,jE(G)Aij=0 其他情形,2023/11/1
9、4,13,例如,对图7-8所示的无向图和有向图,它们的邻接矩阵见图7-9。,(a)无向图G3(b)有向图G4 图7-8 无向图G3及有向图G4,(a)G3的邻接矩阵(b)G4的邻接矩阵 图7-9 邻接矩阵表示,2023/11/14,14,2从无向图的邻接矩阵可以得出如下结论,(1)矩阵是对称的;,(2)第i行或第i 列1的个数为顶点i的度;,(3)矩阵中1的个数的一半为图中边的数目;,(4)很容易判断顶点i和顶点j之间是否有边相连(看矩阵中i行j列值是否为1)。,3从有向图的邻接矩阵可以得出如下结论,(1)矩阵不一定是对称的;,(2)第i 行中1的个数为顶点i的出度;,(3)第j列中1的个数为
10、顶点j的入度;,(4)矩阵中1的个数为图中弧的数目;,(5)很容易判断顶点i 和顶点j 是否有弧相连。,2023/11/14,15,4网的邻接矩阵表示,类似地可以定义网的邻接矩阵为:,wij 若(i,j)E(G)或i,jE(G)Aij=0若i=j 其他情形,网及网的邻接矩阵见图7-10。,(a)网G5(b)网G5的邻接矩阵示意图 图7-10 网及邻接矩阵示意图,2023/11/14,16,5图的邻接矩阵数据类型描述,图的邻接矩阵数据类型描述如下:,const int n=maxn;/图中顶点数 const int e=maxe;/图中边数class graph public:elemtype
11、vn+1;/存放顶点信息v1,v2,vn,不使用v0存储空间int arcsn+1n+1/邻接矩阵/成员函数说明及定义;,2023/11/14,17,6建立无向图的邻接矩阵,void graph:creatadj(graph,该算法的时间复杂度为O(n2)。,2023/11/14,18,7建立有向图的邻接矩阵,void graph:creatadj(graph,该算法的时间复杂度为O(n2)。,2023/11/14,19,8建立无向网的邻接矩阵,void graph:creatadj(graph,该算法的时间复杂度为O(n2)。,2023/11/14,20,9建立有向网的邻接矩阵,void g
12、raph:creatadj(graph,该算法的时间复杂度为O(n2)。,2023/11/14,21,若要将得到的邻接矩阵输出,可以使用如下的语句段:,for(int i=1;i=n;i+)for(int j=1;j=n;j+)coutg.arcsij;coutendl;,7.2.2 邻接表,1图的邻接表表示,将每个结点的边用一个单链表链接起来,若干个结点可以得到若干个单链表,每个单链表都有一个头结点,为将所有头结点联系起来组成一个整体,所有头结点可看成一个一维数组,称这样的链表为邻接表。,2023/11/14,22,例如,图7-8所示的无向图G3和有向图G4的邻接表如图7-11所示。,(a)
13、无向图G3的邻接表,(b)有向图G4的邻接表,(c)有向图G4的逆邻接表,图7-11 邻接表示例,2023/11/14,23,2从无向图的邻接表可以得到如下结论,(1)第i个链表中结点数目为顶点i的度;,(2)所有链表中结点数目的一半为图中边数;,(3)占用的存储单元数目为n+2e。,3从有向图的邻接表可以得到如下结论,(1)第i个链表中结点数目为顶点i的出度;,(2)所有链表中结点数目为图中弧数;,(3)占用的存储单元数目为n+e。,从有向图的邻接表可知,不能求出顶点的入度。为此,我们必须另外建立有向图的逆邻接表,以便求出每一个顶点的入度。逆邻接表在图7-11(c)中已经给出,从该图中可知。
14、有向图的逆邻接表与邻接表类似,只是它是从入度考虑结点,而不是从出度考虑结点。,2023/11/14,24,4图的邻接表数据类型描述,图的邻接表数据类型描述如下:,const int n=maxn;/maxn表示图中最大顶点数const int e=maxe;/maxe表示图中最大边数class link/定义链表类型 public:elemtype data;link*next;class node/定义邻接表的表头类型 public:link an+1;void creatlink(node,在本章中,为描述问题方便直观,我们将elemtype 类型设定为int类型,以此代表图中顶点的序号。
15、,2023/11/14,25,5无向图的邻接表建立,void node:creatlink(node,该算法的时间复杂度为O(n+e)。,2023/11/14,26,6有向图的邻接表建立,void node:creatlink(node,该算法的时间复杂度为O(n+e)。,2023/11/14,27,7网的邻接表的数据类型描述,网的邻接表的数据类型可描述如下:,const int n=maxn;/maxn表示网中最大顶点数const int e=maxe;/maxe表示网中最大边数class link/定义链表类型 public:elemtype data;float w;/定义网上的权值类型
16、为浮点型 link*next;class node/定义邻接表的表头类型 public:link an+1;void creatlink(node,2023/11/14,28,8无向网的邻接表建立,void node:creatlink(node,该算法的时间复杂度为O(n+e)。,2023/11/14,29,9有向网的邻接表建立,void node:creatlink(node,该算法的时间复杂度为O(n+e)。,2023/11/14,30,另外,请注意上面的算法中,建立的邻接表不是惟一的,与你从键盘输入边的顺序有关,输入边的顺序不同,得到的链表也不同。,若要将得到的邻接表输出,可以使用如下
17、的语句:,for(int i=1;i;while(p-next!=NULL)coutdata;p=p-next;coutdataendl;,2023/11/14,31,7.2.3 邻接多重表,在无向图的邻接表中,每条边(Vi,Vj)由两个结点表示,一个结点在第i个链表中,另一个结点在第j个链表中,当需要对边进行操作时,就需要找到表示同一条边的两个结点,这给操作带来不便,在这种情况下采用邻接多重表比较方便。,在邻接多重表中,每条边用一个结点表示,每个结点由五个域组成,其结点结构为:,其中Mark为标志域,用来标记这条边是否被访问过,i和j域为一条边的两个顶点,next1 和next2为两个指针域
18、,分别指向依附于i顶点的下一条边和j顶点的下一条边。而表头与邻接表的表头类似。,2023/11/14,32,邻接多重表的形式见图7-12。,(a)无向图G6(b)G6的邻接多重表 图7-12 邻接多重表示例,2023/11/14,33,7.3 图的遍历,和树的遍历类似,图的遍历也是从某个顶点出发,沿着某条搜索路径对图中所有顶点各作一次访问。若给定的图是连通图,则从图中任一顶点出发顺着边可以访问到该图中所有的顶点,但是,在图中有回路,从图中某一顶点出发访问图中其他顶点时,可能又会回到出发点,而图中可能还剩余有顶点没有访问到,因此,图的遍历较树的遍历更复杂。我们可以设置一个全局型标志数组visit
19、ed来标志某个顶点是否被访过,未访问的值为false,访问过的值为true。根据搜索路径的方向不同,图的遍历有两种方法:深度优先搜索遍历和广度优先搜索遍历。,2023/11/14,34,7.3.1 深度优先搜索遍历,1深度优先搜索思想,深度优先搜索遍历类似于树的先序遍历。假定给定图G的初态是所有顶点均未被访问过,在G中任选一个顶点i作为遍历的初始点,则深度优先搜索遍历可定义如下:,(1)首先访问顶点i,并将其访问标记置为访问过,即visitedi=true;,(2)然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的访问标记置为访问过,visitedj=true,然后从j
20、开始重复此过程,若j已访问,再看与i有边相连的其他顶点;,(3)若与i有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才的过程,直到图中所有顶点都被访问完为止。,2023/11/14,35,例如,对图7-13所示的无向图G7,从顶点1出发的深度优先搜索遍历序列可有多种,下面仅给出其中三种,其他可作类似分析写出来。,图7-13 无向图G7,在无向图G7中,从顶点1出发的深度优先搜索遍历序列(列举三种)为:,1,2,4,8,5,6,3,7,1,2,5,8,4,7,3,6,1,3,6,8,7,4,2,5,2023/11/14,36,2连通图的深度优先搜索,若图是连通的或强连通的,则从图中某一
21、个顶点出发可以访问到图中所有顶点,否则只能访问到一部分顶点。,另外,从刚才写出的遍历结果可以看出,从某一个顶点出发的遍历结果是不惟一的。但是若我们给定图的存储结构,则从某一顶点出发的遍历结果应是惟一的。,(1)用邻接矩阵实现图的深度优先搜索,以图7-13中无向图G7为例,来说明算法的实现,G7的邻接矩阵见图7-14。,图7-14 无向图G7的邻接矩阵,2023/11/14,37,算法描述如下:,#include#define elemtype intconst int n=8;/图中顶点数 const int e=10;/图中边数bool visitedn+1;,class graph pub
22、lic:elemtype vn+1;/存放顶点信息v1,v2,vn,不使用v0存储空间int arcsn+1n+1;/邻接矩阵void creatadj(graph,2023/11/14,38,void graph:creatadj(graph,2023/11/14,39,void graph:dfs(graph g,int i)/从顶点i 出发实现深度优先搜索遍历 int j;coutg.vi;/输出访问顶点 visitedi=true;/全局数组访问标记置1表示已经访问 for(j=1;j=n;j+)if(g.arcsi j=1),void main()graph g;g.creatadj
23、(g);for(i=1;i=n;i+)visitedi=false;g.dfs(g,1);/从顶点1出发访问,2023/11/14,40,用上述算法和无向图G7,可以描述从顶点1出发的深度优先搜索遍历过程,示意图见图7-15,其中实线表示下一层递归调用,虚线表示递归调用的返回。,图7-15 邻接矩阵深度优先搜索示意图,从图7-15中,可以得到从顶点1的遍历结果为1,2,4,8,5,6,3,7。同样可以分析出从其他顶点出发的遍历结果。,2023/11/14,41,(2)用邻接表实现图的深度优先搜索,仍以图7-13中无向图G7为例,来说明算法的实现,G7的邻接表见图7-16,图7-16 G7的邻接
24、表,2023/11/14,42,算法描述如下:,#include#define elemtype intconst int n=8;/n表示图中最大顶点数const int e=10;/e为图中最大边数bool visitedn+1;,class link/定义链表类型 public:elemtype data;link*next;,2023/11/14,43,class node/定义邻接表的表头类型 public:link an+1;void creatlink(node,void node:creatlink(node,2023/11/14,44,for(k=1;kij;/输入一条边(i
25、,j)s=new link;/申请一个动态存储单元s-data=j;s-next=g.ai.next;g.ai.next=s;s=new link;s-data=i;s-next=g.aj.next;g.aj.next=s;,2023/11/14,45,void node:dfs1(node g,int i)link*p;coutdata)dfs1(g,p-data);p=p-next;,void main()node g;g.creatlink(g);for(i=1;i=n;i+)visitedi=false;g.dfs1(g,1);/从顶点1访问,2023/11/14,46,用刚才的算法及
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 07
链接地址:https://www.31ppt.com/p-6578874.html