收藏 分享(赏)

《数据结构教程》第7章 图.ppt

上传人:hskm5268 文档编号:6952705 上传时间:2019-04-28 格式:PPT 页数:41 大小:355KB
下载 相关 举报
《数据结构教程》第7章 图.ppt_第1页
第1页 / 共41页
《数据结构教程》第7章 图.ppt_第2页
第2页 / 共41页
《数据结构教程》第7章 图.ppt_第3页
第3页 / 共41页
《数据结构教程》第7章 图.ppt_第4页
第4页 / 共41页
《数据结构教程》第7章 图.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、2019/4/28,1,7.1 图7.2 图的存储结构 7.3 图的实现7.4 图的遍历7.5 最小生成树7.6 最短路径,第7章 图,2019/4/28,2,7.1.1 图的定义及运算 一、图的定义:图(graph)是由两个集合V和E所限定的一种数据结构,记作 G=(V,E) 其中:V是构成图的顶点的非空有限集, E是表示顶点之间关系的边的集合。,7.1 图的基本概念,2019/4/28,3,(4)子图:假设有两个图G = ( V ( G ) , E ( G ) )和G= ( V ( G ) , E ( G ) ) 。若V(G)V(G)且E(G)E(G),则称G是G的。,(1)无向图:边没有

2、方向性; (2)有向图:边有方向性。 (3)完全图:图任意两个顶点都有一条边相 连接;若 n 个顶点的无向图有 n(n-1)/2 条边, 称为无向完全图若 n 个顶点的有向图有n(n-1) 条边, 称为有向完全图,2019/4/28,4,二、图的运算 (1) CreateGraph(&G,V,E): 根据顶点集V和边集E创建图G. (2) DestroyGraph(&G): 销毁图G. (3) FirstAdjVex(G,v): 求图G中顶点v的第一个邻接顶点. (4) NextAdjVex(G,v,w): 求图G中顶点v的相对于其邻接顶点w的下一个邻接顶点.,2019/4/28,5,(5)

3、InsertVex(&G,v): 在图G中插入顶点v. (6) DeleteVex(&G,v): 在图G中删除顶点v及其与v相关的边. (7) InsertArc(&G,v,w): 在图G中插入边(v,w)或. (8) DeletArc(&G,v,w): 在图G中删除边(v,w)或. (9) DFSTraverse(G,v): 从图G的v顶点出发,深度优先遍历图. (10) BFSTraverse(G,v): 从图G的v顶点出发,广度优先遍历图.,2019/4/28,6,7.1.2 图的基本术语,1、顶点(Vertex) :双重标记法;,2、边(edge) (1)无向边(i,j)=(j,i)

4、(2)有向边(弧(arc) )。称i为弧尾(始点),j称为弧头(终点),2019/4/28,7,4、路径 从顶点i到顶点j之间由边或弧组成通路。 路径长度:路径上所含边的数目 回路或环(Cycle) : 路径上第1个顶点与最后一个顶点相同的路径 简单路径:路径的顶点序列中无重复顶点的路径 简单回路:除第1个顶点与最后一个顶点相同之外,其余顶点不重复出现的回路,2019/4/28,8,连通图:图中任意两顶点都是互相可达的无向图 连通分量:无向图的极大连通子图 强连通图:任意两个顶点间都互相可达的有向图 强连通分量:有向图的极大强连通子图,2019/4/28,9,树图:一个不含回路的无向连通图,是

5、一个极小连通子图,它含有图中全部n个顶点,但只有n-1条边。树图中所有顶点是同等的,无须指定其中一个顶点为根。,2019/4/28,10,5、权: 有时图中的每条边上都对应一个数值,这个数值称为边上的权。 网络:带权的图 在网络中的路径长度是这些边上的权值之和。,2019/4/28,11,7.2 图的存储表示,7.2.1 邻接矩阵表示法:个一维数组表示顶点,#define MAXVER 21 /* MAXVER-1为图中至多顶点数 */ #define INFINITY INT_MAX /* 表示的权值 */ typedef struct vextype vexsMAXVER ;int arc

6、sMAXVERMAXVER ;int vexnum , arcnum ; Mgraph ;,2019/4/28,12,2019/4/28,13,2019/4/28,14,2019/4/28,15,2019/4/28,16,特 点,(1) 无向图的邻接矩阵具有如下的特点: 1)它是对称阵(因为(i , j) = ( j , i) ); 2)第i行(或第i列)上1元素的个数等于顶点i的度数; 3)整个矩阵中1元素的个数等于边数的2倍;,2019/4/28,17,(2) 有向图邻接矩阵具有如下特点: 1)一般情况下,它不是对称阵(因为 ); 2)第i行上1元素的个数等于顶点i的出度; 3)第i列上1

7、元素的个数等于顶点i的入度; 4)整个矩阵中1元素的个数等于弧数;,2019/4/28,18,7.2.2 邻接表表示法,图的邻接表表示的存储结构类型定义如下: #define MAXVER 21 #define MAXVER 21 typedef struct listnode typedef struct wlistnode int adjvex ; int adjvex , weight;struct listnode * next ; struct wlistnode * next;listnode; wlistnode ; typedef struct typedef struct v

8、extype data ; vextype data; listnode *first ; wlistnode * first;headnode ; wheadnode ; typedef struct typedef struct headnode vexsMAXVER ; wheadnode vexsMAXSIZE ;int vexnum , arcnum ; int vexnum , arcnum ;ALgraph ; WALgraph ;,2019/4/28,19,2019/4/28,20,2019/4/28,21,2019/4/28,22,出度,入度,2019/4/28,23,根据各

9、种图的邻接表存储结构,可以得出如下结论: (1) 对于无向图和无向网的邻接表: 1)第i个单链表的长度等于顶点i的度数; 2)总表结点数等于边数的2倍。 (2) 对于有向图和有向网的邻接表: 1)第i个单链表的长度等于顶点i的出度; 2)总表结点数等于弧数。,2019/4/28,24,3、讨论:邻接表与邻接矩阵有什么异同之处?,1. 联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。 2. 区别: 对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。,2019/4/28,25, 邻接矩阵的空间复杂度为O(

10、n2),而邻接表的空间复杂度为O(n+e)。 3. 用途: 邻接矩阵多用于稠密图的存储(e接近n(n-1)/2); 而邻接表多用于稀疏图的存储(en2),2019/4/28,26,7.2.3 图的其它存储表示法,1. 邻接多重表(adjacency multilist)每条边只用一个结点表示,,#define MAXVER 21 typedef struct edgenode int mark,ivex,jvex; struct edgenode *ilink,*jlink;int weight; edgenode; typedef struct,2019/4/28,27,vertype da

11、ta;edgenode *firstedge;vexnode; typedef struct vexnode vexsMAXVER;int vexnum,edgenum; AMLgraph;,2019/4/28,28,2019/4/28,29,2019/4/28,30,2. 十字链表(orthogonal list),十字链表是有向图的另一种链式存储结构,可以将它看作是将有向图的邻接表和逆邻接表结合起来而得到的一种链表。,2019/4/28,31,2019/4/28,32,2019/4/28,33,7.2.4 图的存储结构的建立,/* 图的邻接矩阵存储结构创建算法 */ Mgraph crea

12、teMgraph( ) Mgraph G;int i,j,k,code,w;char ch;printf(“输入图的顶点数,边数:”);scanf(“%d,%d”,i+),2019/4/28,34,printf(“ n输入第%d个顶点信息 ”,I );scanf(“%c”,2019/4/28,35,case 2: for(i=1,i=G.vexnum;i+)for(j=1;j=G.vexnum;j+)G.arcsij=0;for(k=1;k=G.arcnum;k+)printf(“ n输入第%d条弧的始点,终点:”,k );scanf(“%d,%d”,scanf(“%d,%d”,2019/4/

13、28,36,case 3: for(i=1,i=G.vexnum;i+) /* 初始化主对角线元素为0,其它元素为 */for(j=1;j=G.vexnum;j+)if(i= =j)G.arcsij=0;elseG.arcsij=INFINITY;for(k=1;k=G.arcnum;k+)printf(“ n输入第%d条边的始点,终点和权:”,k );,2019/4/28,37,scanf(“%d,%d,%d”,k+),2019/4/28,38,printf(“ n输入第%d条弧的始点,终点和权:”,k );scanf(“%d,%d,%d”, /* createMgraph */,2019/

14、4/28,39,/* 无向图的邻接表存储结构创建算法 */ ALgraph createALgraph() ALgraph G;int i,s,d;listnode *p,*q;printf(“输入图的顶点数和边数:”);scanf(“%d,%d”,2019/4/28,40, /* for */ for(i=1;iadjvex=d;p-next=G.vexss.first;,2019/4/28,41,G.vexss.first=p;q=(listnode*)malloc(sizeof(listnode); /* 形成d单链表的表结点q并插入到表头位置 */q-adjvex=s;q-next=G.vexsd.first;G.vexsd.first=q; /* for */return(G); /* createALgraph */,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报