收藏 分享(赏)

第二节 图的存储结构(讲授).ppt

上传人:Facebook 文档编号:3413130 上传时间:2018-10-25 格式:PPT 页数:25 大小:466.50KB
下载 相关 举报
第二节 图的存储结构(讲授).ppt_第1页
第1页 / 共25页
第二节 图的存储结构(讲授).ppt_第2页
第2页 / 共25页
第二节 图的存储结构(讲授).ppt_第3页
第3页 / 共25页
第二节 图的存储结构(讲授).ppt_第4页
第4页 / 共25页
第二节 图的存储结构(讲授).ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、8.2 图的存储结构,邻接矩阵邻接表,7.2.1 邻接矩阵,对于无向图,(vi,vj)和(vj,vi)表示同一条边,因此,在邻接矩阵中aij=aji。对有向图,弧和表示方向不同的两条弧,所以aijaji。 在图的顶点确定的情况下,其邻接矩阵表示是唯一的。,不带权值的邻接矩阵 邻接矩阵(Adjacency Matrix)是表示图中顶点之间相邻关系的矩阵。设G(V, E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵Ann:,无向图的邻接矩阵是以主对角线对称的,第i 行(列)1 的个数就是顶点vi 的度。即,上图中:D(1)=2 D(2)=3 D(3)=2 D(4)=3 D(5)=2,

2、有向图的邻接矩阵可能是不对称的。在有向图中: 第 i 行中 1 的个数就是顶点 i 的出度。 第 j 列 中1 的个数就是顶点 j 的入度。 有向图中各顶点的入度之和等于出度之和。,ID (vi)=,OD (vi)=,上图中:D(1)=OD(1)+ID(1)=2+1=3 D(2)=OD(2)+ID(2)= 1+2=3 D(3)=OD(3)+ID(3)=1+2=3 D(4)=OD(4)+ID(4)= 2+1=3,其中:v1=1 v2=2v3=3 v4=4,练习:试给出下列三个图的邻接矩阵。,G3,G1,G2,带权值的邻接矩阵,结论总结:,(1)因为不考虑顶点到自身的边或弧,所以邻接矩阵的对角线必

3、为0; (2)无向图的邻接矩阵为对称矩阵,所以可用特殊矩阵压缩方式存储; (3)无向图的顶点的度为邻接矩阵中该顶点对应的行(列)中非零元个数; (5)有向图的邻接矩阵不一定为对称矩阵,若非零元比零元少得多,则可用三元组表压缩存储; (6)有向图中顶点的入度为该顶点对应列中非零元的个数,出度为该顶点对应行中为非零元的个数。,邻接矩阵表示法中图的类型定义:,#define MAXSIZE 100 /*图的顶点个数*/ typedef struc int no; /顶点编号infotype info; /顶点其它信息 vertextype; / 顶点类型 typedef struct /图的定义 v

4、ertextype vexsMAXSIZE; /*顶点信息表*/int edgesMAXSIZE MAXSIZE ;/ *邻接矩阵*/int n ; /*顶点数*/int e ; /*边数*/mgraph;,2,1,4,3,5,无向图,t-n=5 t-e=6,mgraph *t;,B,A,D,C,E,有向图,mgraph *t;,t-n=5 t-e=6,邻接矩阵表示法中无向网络的建立算法 void Create_Graph(mgraph *ga) int i,j ,k,w;printf (“请输入图的顶点数和边数:n“);scanf (“%d“,&(ga-n),& (ga-e);printf

5、(“请输入顶点信息(顶点编号),建立顶点信息表:n“) ;for(i = 0;in;i+)scanf(“%c“,&(ga-vexsi);/*输入顶点信息*/for (i = 0;in;i+) /*邻接矩阵初始化*/ for (j = 0;jn;j+)ga-edgesij = 0;for (k = 0;ke;k+) /*读入边的顶点编号和权值,建立邻接矩阵*/ printf (“请输入第%d条边的顶点序号i,j和权值w:“,k+1);scanf (“%d,%d,%d“,&i,&j,&w);ga-edgesij = w;ga-edgesji = w; ,算法分析:该算法的执行时间是O(n+n2+e

6、),由于en2,所以算法的时间复杂度为O(n2)。,单循环,时间复杂度为O(n).,二重循环,时间复杂度为O(n2).,单循环,时间复杂度为e.,7.2.2 邻接表,邻接表是图的一种链式存储结构。在邻接表中为图中每个顶点建立一个单链表,用单链表中的一个结点表示依附于该顶点的一条边(或表示以该顶点为弧尾的一条弧),称为边(或弧)结点。 因此邻接表是由单链表的表头形成的顶点表和单链表其余结点形成的边表两部分组成。图的邻接表表表示不唯一。图的链式存储结构特征:(1)为每个顶点建立一个单链表;(2)第i个单链表中包含顶点Vi的所有邻接顶点。,无向图的邻接表(不带权),表结点,表头结点,每个链表的前边附

7、设一个表头结点。把同一个顶点发出的边链接在同一个边链表中,链表的每一个结点代表一条边,叫做表结点。,假设数组下标自1开始,1 2 3 4,有向图的邻接表和逆邻接表,G,邻接表,逆邻接表,1 2 3,1 2 3,在有向图的邻接表中,第 i 个边链表链接的边都是顶点 i 发出的边。也叫做出边表。 在有向图的逆邻接表中,第 i 个边链表链接的边都是进入顶点 i 的边。也叫做入边表。,试给出下图的邻接表和逆邻接表。,设顶点存放的数组下标自1开始,1 2 3 4 5,1 2 3 4 5,邻接表的类型定义(P 202),说明: 在邻接表的边链表中,各个表结点的链入顺序任意,视表结点输入次序而定(不唯一)。

8、 设图中有 n 个顶点,e 条边,则用邻接表表示无向图时,需要 n 个表头结点,2e 个表结点;用邻接表表示有向图时,若不考虑逆邻接表,只需 n 个表头结点,e 个表结点。 带权图的边表结点中还应保存该边上的权值 info。,网络 (带权图) 的邻接表,边表结点,adjvex:顶点号 info:边上所带的权 nextare:指针,【例1 】已知有向图G用邻接矩阵存储,分别设计实现以下要求的算法: (1)求出图G中每个顶点的入度; (2)求出图G中出度最大的一个顶点,输出该顶点编号; (3)判断图G中是否存在边。,解:(1)求出图G中每个顶点的入度。 方法:扫描邻接矩阵,对于顶点j,累计第j列中

9、非零元素个数即为入度,最后输出个数。,void indsl(MGraph g) int i,j,k;for (j=1; j=g.n; j+) k=0;for (i=1; i=g.n; i+)if (g.edgesij!=0) k+;printf(“顶点%d:%dn”,j,k); ,(2)求出图G中出度最大的一个顶点,输出该顶点编号。,方法:用maxds记录最大出度,maxv记录最大出度的顶点。扫描邻接矩阵,对于顶点i,记录到各顶点的边数k,k与maxds比较,将较大者保存到maxds中,并将i保存到maxv中,最后输出maxds和maxv。算法如下:,void maxoutdsl (MGrap

10、h g) int maxv=0,maxds=0,i,j,k;for (i=1;imaxds)maxds=k; /maxds记录最大出度maxv=i; /maxv记录最大出度的顶点printf (“最大出度:顶点%d的出度=%dn”,maxv,maxds); ,(3)判断图G中是否存在边。,void arcl(MGraph g,int i,int j) if (g.edgesij!=0)printf (“存在%d到%d的边n”,i,j);elseprintf (“不存在%d到%d的边n”,i,j); ,方法:若邻接矩阵g对应的g.edgesij不为零,表示顶点i到顶点j有边,否则无边。算法如下:

11、,一、填空 (1)对于一个具有n个顶点和e条边的无向图,采用邻接表 表示,则表头向量的大小为 ,所有邻接表中的结点数 为 。 (2) 对于n个顶点的有向图,采用邻接矩阵表示,求图中 边数的方法是 ;判断任意两个顶点i和j是 否相连的方法是 ;求任意一个顶点vi的度 的方法是 。,n,2e,矩阵中1的个数,aij是否为1,出度为第i行中1的个数,入度为第i列中1的个数,课堂练习题,二、判断 (1) 如果表示图的邻接矩阵是对称矩阵,则该图一定是无向图。( ) (2) 如果表示有向图的邻接矩阵是对称矩阵,则该有向图一定是完全有向图。( ) (3)如果表示某个图的邻接矩阵不是对称矩阵,则该图一定是有向图。 ( ),作业:P233 8.1 8.2,

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

当前位置:首页 > 中等教育 > 小学课件

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


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

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

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