数据结构 图有些想法

图的定义与术语

1.图的基本定义

是一种网状数据结构
有向图:有箭头边指向的图
无向图:无箭头边指向的图

2.图的基本术语:

  • 完全图:分有向完全图和无向完全图,完全图就是所有节点与其他节点都有线连接。

  • 稀疏图:在完全图里面,如果少了几条边,那么就是稀疏图

  • 稠密图:不是稀疏图的就是稠密图

  • :在无向图里面,一个节点有几条边度就是几。

  • 入度与出度是在有向图里面讨论的
    对于有向图里面的某个结点A:A的入度就是指向A的箭头边,出度就是由A结点指向其他结点的边。如图:
    在这里插入图片描述
    A的入度:1
    A的出度:2

  • :给图的边赋值,该值是自定义的,称为权。权可以表示很多信息,如:距离,耗费等信息。

  • :带权的值称为赋权图或网。

  • 路径:某个结点到另一个结点所经过的边是路径,路径的长度是经过边的数目。如果路径上每个顶点各不相同,就是简单路径。

  • 回路:如果一条路径,其第一个顶点和最后一个顶点相同,该路径就是一个回路。如果除了第一个和最后一个顶点外,其余顶点均不重复出现的回路为简单回路。

  • 连通:无向图中,有A,B两个顶点,它们之间有一条路径相同,那么A、B结点是连通的。

  • 连通图:在无向图中,任意两点都是连通的,则该图为连通图。

  • 强连通图:在有向图中,任意一对顶点(Vi, Vj),从Vi到Vj 或者 从Vj到Vi 都有路径,则称该图为强连通图。

图的存储结构

1.邻接矩阵表示法

也叫数组表示法。

① 对于无权的无向图(或有向图),邻接矩阵有如下性质:
如果<Vi, Vj>或(Vi, Vj)属于VR,则<Vi, Vj>为1,否则为0。

如图:
在这里插入图片描述
邻接矩阵是:
在这里插入图片描述
比如V1和V2两个结点相连,则在矩阵里面,[1, 2] = 1 ,[2, 1] = 1
( [i, j],1<= i <=5,1<= j <=5 )

该矩阵是对称矩阵。
对于有向图,求解过程差不多。

② 对于有权的有向图(或无向图),邻接矩阵有如下性质:
如果<Vi, Vj>或(Vi, Vj)属于VR,则<Vi, Vj>为W(ij),否则为∞。

如下有向图:
在这里插入图片描述

邻接矩阵为:
在这里插入图片描述
说明:如V1结点到V2结点,该路径权值为6。

而且对于有权有向图:横向看某一行,值不为无穷的个数就是该节点的出度数。纵向看某一列,值不为无穷的个数就是该节点的入度数。(无权有向图类似,判断一下矩阵里面数值为1或0的个数)

邻接矩阵特点:

  • 对于结点多,边少的图,会邻接矩阵会浪费很多空间。对于对称的邻接矩阵,可以采用压缩存储法。
  • 便于运算,只需要判断矩阵中的值可以判断结点是否相连接,还便于求解各个顶点的度。

2.邻接表表示法

基于邻接矩阵的缺陷提出的,高效存储图的关联信息的数据结构。
结构:
① 表头结点表
在这里插入图片描述
② 弧结点结构(边表)
在这里插入图片描述
③ 实例

  • 无向图如下:
    在这里插入图片描述
    邻接表数据域里面的值是结点下标值(当然可以使其他值)
    在这里插入图片描述
  • 有向图如下:
    在这里插入图片描述
    邻接表:
    在这里插入图片描述

该有向图邻接表里面,数据域的值可以理解是字母顺序对应的数值(如A是1,B是2,当然也可以放其他值)
横向看每一行,结点数就是出度数,如A结点的出度数是2
如果按照之前的做法给邻接表的数据域赋值(按字母顺序顺序,如A是1,B是2),那么在整个邻接表中,值为1的结点个数就是A结点的入度数,A的入度数为1,依次类推。

如果要判断有向图,任意两点之间是否有边就比较麻烦。如果要求解第i个顶点的入度,就需要遍历整个邻接表。
所以就有了逆邻接表法解决该问题。

3.逆邻接表

对每个顶点Vi ,建立一个所有以顶点Vi为弧头的表,如图:
在这里插入图片描述
逆邻接表是:
在这里插入图片描述

对于A结点,横向看,只有一个节点,所以A结点的入度数是1。亦可知入度结点是D。

4.十字链表

有向图要构造邻接表和逆邻接表比较麻烦,所以结合这两张表的特点产生了十字链表。

  • 十字链表弧结点结构
    在这里插入图片描述

  • 十字链表顶点结点结构
    在这里插入图片描述
    如下有向图:
    在这里插入图片描述
    十字链表如下:
    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值