【创造者】二叉树2 图的储存

02章 图的储存 1.图的表示(储存) 常见的储存图的方法有三种,边集数组,邻接矩阵和邻接表,其实还有一种算法竞 赛中常用的链式前向星,但本篇暂不介绍。 2.边集数组 边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的 信息。这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end) 表示成代码形式就是: struct edge{ int begin,end,weight; //u代表起点,v代表终点,w代表权重。 } edges[100005]; 3.邻接矩阵 邻接矩阵通常采用一个一维数组存储图中节点的信息,采用一个 二维数组存储图中节点之间的邻接关系。 1)无向图的邻接矩阵 在无向图中,若从节点 vi 到节点 vj 有边,则邻接矩阵 M[i][j]=M[j][i]=1,否则 M[i][j]=0。 例如,一个无向图的节点信息和邻接矩阵如下图所示。在该无向图中,从节点 a 到 节点 b 有边,从节点 b 到节点 a 也有边,节点 a、b 在一维数组中的存储位置分 别为0、1,则 M[0][1]=M[1][0],则 M[0][1]=M[1][0]=1。 无向图的邻接矩阵是对称矩阵,并且是唯一的。 2)有向图的邻接矩阵 在有向图中,若从节点vi 到节点vj 有边,则邻接矩阵 M[i][j]=1,否则 M[i][j]=0。 注意: 以尖括号表示的是有序对,以圆括号(vi ,vj )表示的是无序对,后 同。 例如,一个有向图的节点信息和邻接矩阵如下图所示。在该有向图中,从节点a 到 节点b 有边,节点a 、b 在一维数组中的存储位置分别为0、1,因此 M [0][1]=1。 有向图中的边是有向边,从节点a 到节点b 有边,从节点b 到节点a 不一定有边, 因此有向图的邻接矩阵不一定是对称的。 有向图的邻接矩阵不一定是对称的。 3) 邻接矩阵的优缺点 (1)优点如下。 • 快速判断在两节点之间是否有边。在图中,Edge[i ][j ]=1, 表示有边;Edge[i ][j ]=0,表示无边。在网中,Edge[i ][j ]=∞, 表示无边,否则表示有边。时间复杂度为O (1)。 • 方便计算各节点的度。在无向图中,邻接矩阵第i 行元素之和 就是节点i 的度;在有向图中,第i 行元素之和就是节点i 的出度, 第i 列元素之和就是节点i 的入度。时间复杂度为O (n )。 (2)缺点如下。 • 不便于增删节点。增删节点时,需要改变邻接矩阵的大小,效率较低。 • 不便于访问所有邻接点。访问第i 个节点的所有邻接点时,需要访问第i 行的所有 元素,时间复杂度为 O (n)。访问所有节点的邻接点,时间复杂度为O(n^2)。 • 空间复杂度高,为O (n^2 )。如果结点大于10000了,就会超过空间。 和权(weight)组成。 边集数组结构:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值