数据结构(C描述)电子教案

上传人:宝路 文档编号:47325274 上传时间:2018-07-01 格式:PPT 页数:77 大小:706.52KB
返回 下载 相关 举报
数据结构(C描述)电子教案_第1页
第1页 / 共77页
数据结构(C描述)电子教案_第2页
第2页 / 共77页
数据结构(C描述)电子教案_第3页
第3页 / 共77页
数据结构(C描述)电子教案_第4页
第4页 / 共77页
数据结构(C描述)电子教案_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《数据结构(C描述)电子教案》由会员分享,可在线阅读,更多相关《数据结构(C描述)电子教案(77页珍藏版)》请在金锄头文库上搜索。

1、第7章 图 数据结构(C+描述) 目录7.6拓扑排序7.1 图的基本概念7.2 图的存贮结构7.3 图的遍历7.4 生成树和最小生成树7.5最短路径退出7.1 图的基本概念7.1.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=,。7.1.2 图的基本术语 1. 有向图和无向图在

2、图中,若用箭头标明了边是有方向性的,则称这样的 图为有向图,否则称为无向图。如图7-1中,G1为无向图 ,G2为有向图。在无向图中,一条边(x,y)与(y,x)表示的结果相同, 用圆括号表示,在有向图中,一条边与表示 的结果不相同,故用尖括号表示。x,y表示从顶点x发 向顶点y的边,x为始点,y为终点。有向边也称为弧,x 为弧尾,y为弧头,则x,y表示为一条弧,而y,x表示y 为弧尾,x为弧头的另一条弧 。 2. 完全图、稠密图、稀疏图 具有n个顶点,n(n-1)/2条边的图,称为完全无向图,具有 n个顶点,n(n-1) 条弧的有向图,称为完全有向图。完全无 向图和完全有向图都称为完全图。对于

3、一般无向图,顶点数为n,边数为e,则 0e n(n- 1)/2。对于一般有向图,顶点数为n,弧数为e, 则 0en(n- 1) 。当一个图接近完全图时,则称它为稠密图,相反地, 当一个图中含有较少的边或弧时,则称它为稀疏图。3. 度、入度、出度在图中,一个顶点依附的边或弧的数目,称为该顶点的 度。在有向图中,一个顶点依附的弧头数目,称为该顶 点的入度。一个顶点依附的弧尾数目,称为该顶点的出 度,某个顶点的入度和出度之和称为该顶点的度。另外,若图中有n个顶点,e条边或弧,第i个顶点的度为di ,则有e= 4. 子图若有两个图G1和G2, G1=(V1,E1), G2=(V2,E2), 满足如 下

4、条件: V2V1 ,E2 E1,即V2为V1的子集,E2为E1 的子集,称图G2为图G1的子图。图和子图的示例具体见图7-2。5 权 在图的边或弧中给出相关的数,称为权。 权可以代 表一个顶点到另一个顶点的距离,耗费等,带权图 一般称为网。带权图的示例具体见图7-3。6 连通图和强连通图 在无向图中,若从顶点i到顶点j有路径,则称顶点i和 顶点j是连通的。若任意两个顶点都是连通的,则称此 无向图为连通图,否则称为非连通图。 连通图和非连通图示例见图7-4。 在有向图中,若从顶点i到顶点j有路径,则称从顶点i 和顶点j是连通的,若图中任意两个顶点都是连通的, 则称此有向图为强连通图,否则称为非强

5、连通图。 强连通图和非强连通图示例见图7-5。 7 连通分量和强连通分量 无向图中,极大的连通子图为该图的连通分量。 显然,任何连通图的连通分量只有一个,即它本 身,而非连通图有多个连通分量。对于图7-4 中的非连通图,它的连通分量见图7-6。 有向图中,极大的强连通子图为该 图的强连通分量 。显然,任何强连通图的强连通分量只有一个,即 它本身,而非强连通图有多个强连通分量。对于图7-5 中的非强连通图,它的强连通分量见图7-7 。 8路径、回路 在无向图G中,若存在一个顶点序列Vp ,Vi1,Vi2,Vin ,Vq, 使得(Vp,Vi1),(Vi1,Vi2),.,(Vin,Vq)均属于E(G

6、) ,则称顶点Vp到Vq存在一条路径。若一条路径上除起点和 终点可以相同外,其余顶点均不相同,则称此路径为简单 路径。起点和终点相同的路径称为回路,简单路径组成的 回路称为简单回路。路径上经过的边的数目称为该路径的 路径长度。 9 有根图 在一个有向图中,若从顶点V有路径可以到达图中的 其它所有顶点,则称此有向图为有根图,顶点V称作 图的根。 10 生成树、生成森林 连通图的生成树是一个极小连通子图,它包含图中全部n 个顶点和n-1条不构成回路的边。非边通图的生成树则组 成一个生成森林。若图中有n个顶点,m个连通分量,则 生成森林中有n-m条边。7.2 图的存贮结构 7.2.1 邻接矩阵 1

7、图的邻接矩阵表示在邻接矩阵表示中,除了存放顶点本身信息外,还 用一个矩阵表示各个顶点之间的关系。若(i,j) E(G)或i,jE(G),则矩阵中第i行 第j列元素值为 1,否则为0 。图的邻接矩阵定义为:1 若(i,j)E(G)或i,jE(G)Aij= 0 其它情形 例如, 对图7-8所示的无向图和有向图,它们的邻接矩阵 见图7-9。 2 从无向图的邻接矩阵可以得出如下结论 (1)矩阵是对称的;(2)第i行或第i 列1的个数为顶点i 的度;(3)矩阵中1的个数的一半为图中边的数目;(4)很容易判断顶点i 和顶点j之间是否有边相连(看 矩阵中i行j列值是否为1)。 3 从有向图的邻接矩阵可以得出

8、如下结论(1) 矩阵不一定是对称的;(2) 第i 行中1的个数为顶点i 的出度;(3) 第i列中1的个数为顶点 i的入度;(4) 矩阵中1的个数为图中弧的数目;(5) 很容易判断顶点i 和顶点j 是否有弧相连.4 网的邻接矩阵表示 类似地可以定义网的邻接矩阵为:wij 若(i,j)E(G)或i,jE(G)Aij= 0 若i=j 其它情形网及网的邻接矩阵见图7-10。5 图的邻接矩阵数据类型描述图的邻接矩阵数据类型描述如下:const int n= maxn; / 图中顶点数 const int e=maxe ; / 图中边数struct graph elemtype Vn+1; / 存放顶点信

9、息 v1,v2,.vn,不使用v0存储空间int arcsn+1n+1 / 邻接矩阵;6 建立无向图的邻接矩阵 void creatadj(graph for (k=1; kg.vk; /输入顶点信息 for (i=1; iij; /输入一条边(i,j) g.arcsij=1;g.arcsji=1;该算法的时间复杂度为O(n2)。 7.建立有向图的邻接矩阵 void creatadj(graph for (k=1; kg.vk; /输入顶点信息 for (i=1; iij; /输入一条弧 g.arcsij=1;该算法的时间复杂度为O(n2)。8.建立无向网的邻接矩阵void creatadj(

10、graph float w;for (k=1; kg.vk; /输入顶点信息 for (i=1; iijw; /输入一条边(i,j) 及权值w g.arcsij=w;g.arcsji=w;该算法的时间复杂度为O(n2)。 9.建立有向网的邻接矩阵void creatadj(graph float w;for (k=1; kg.vk; /输入顶点信息 for (i=1; iijw; /输入一条弧 及权值w g.arcsij=w;该算法的时间复杂度为O(n2)。7.2.2 邻接表 1 图的邻接表表示 将每个结点的边用一个单链表链接起来,若干个结点 可以得到若干个单链表,每个单链表都有一个头结点 ,

11、所有头结点组成一个一维数组,称这样的链表为邻 接表。例如,图7-8所示的无向图G3和有向图G4的邻接表见 图7-11所示 12432 从无向图的邻接表可以得到如下结论 (1)第i 个链表中结点数目为顶点i的度;(2)所有链表中结点数目的一半为图中边数;(3)占用的存储单元数目为n+2e 。3 从有向图的邻接表可以得到如下结论 (1)第i 个链表中结点数目为顶点i的出度;(2)所有链表中结点数目为图中弧数;(3)占用的存储单元数目为n+e 。 从有向图的邻接表可知,不能求出顶点的入度。为此 ,我们必须另外建立有向图的逆邻接表,以便求出每 一个顶点的入度。逆邻接表在图7-11(c)中已经给出, 从

12、该图中可知。有向图的逆邻接表与邻接表类似,只 是它是从入度考虑结点,而不是从出度考虑结点。 4 图的邻接表数据类型描述图的邻接表数据类型描述如下:const int n =maxn; / maxn表示图中最大顶点 数const int e= maxe ; / maxe图中最大边数struct link /定义链表类型 elemtype data ;link *next ;struct node /定义邻接表的表头类型 elemtype v; /顶点信息link *next;an+1;5.无向图的邻接表建立 void creatlink( ) int i,j,k ; link *s ;for(i

13、=1; iij ; /输入一条边 (i,j)s=new link; /申请一个动态存储单元sdata=j ;s-next=ai.next ;ai.next=s ;s=new link; s-data=i ;s-next=aj.next ;aj.next=s ; 该算法的时间复杂度为O(n+e)。 6.有向图的邻接表建立 void creatlink( ) int i,j,k ; link *s ;for(i=1; iij ; /输入一条边 s=new link; /申请一个动态存储单元sdata=j ;s-next=ai.next ;ai.next=s ;该算法的时间复杂度为O(n+e)。7.网的邻接表的数据类型描述 网的邻接表的数据类型可描述如下:const int n =maxn; / maxn表示网中最大顶点数const int e= maxe ; / maxe网中最大边数struct link /定义链表类型 elemtype data ;float w;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号