图:java实现

知人者智,自知者明。人之所以痛苦,是因为无法跨越知道和做到的鸿沟。所以,我们要知道自己能做什么。

定义

图的范围比较广,类似下图
在这里插入图片描述

在这里插入图片描述

其实树,栈,队列也可以看做是一种特殊的图。图由一些点与线组合而成,我们称这些点为顶点,这些线为边或者弧。本质上图就是通过线来描述各个点之间的关系。图大类分为有向图与无向图。

存储方式

图有很多中存储方式,

  1. 数组 + 二维数组存储
    在这里插入图片描述

通过顶点存在数组里面,二维数组内1代表有指向,0代表无指向,无向图存储图内关系
在这里插入图片描述
二维数组存储顶点之间的关系。
在这里插入图片描述
由于是无向图,可以发现与右斜线对称,A列/行加起来就是图的边条数。
在这里插入图片描述
同理,下面是无向图的表示方式
在这里插入图片描述
在这里插入图片描述
arr[A][B] = 1 ,arr[A][C] = 1,依次类推,如下图,与有向图相比,就不是对称,但也有其规律,顶点a的行之和是出度,列之和是入度。
在这里插入图片描述
在图的术语中,还有一种叫网的概念,即带权的图。
在这里插入图片描述
我们以∞代表,到达不了
在这里插入图片描述
还有一种方式可以表示
邻接表与逆邻接表表示法

在这里插入图片描述

单个的表示方式有点问题,当在删除一个顶点的时候,需要删除的表示的点比较多,上图例子并不能很直观的反应这个问题,如果添加一条线 b->c,删除c的时候需要三处B点与A点2处链表。因此图还有一下表示方法。

十字链表法
便于说明,在之前图上新增一条边 EB
在这里插入图片描述

邻接表与逆邻接表结合,修改存储表结构。
在这里插入图片描述
黑色线代表邻接表,蓝色线代表逆邻接表。tailVex(线的初始点) headVex(线到达点) headLink (上一点,即逆邻接表)tailLink(下一点指向)
以B为例,b有2个出度,01,41,因此指向如图。

邻接多重表
在这里插入图片描述
以A点为例,除了01指向,还有02,03,04关联A点,因此a的指向是一个链表,以此建立关系,不得不说,这个图看起来非常抽象难懂,我自己也画了好久,看视频加上自己理解来的,可能看不太懂,我也很难解释,后来发现还有其他文章说得很清楚,后续再重新写写邻接多重表。这里就偷个懒了。
边集数组
边集数组是最简单的了,用两个一维数组来存储,一个数据里面存顶点,另一个存边起始与结束顶点下标。黄色为权重,也可以加上。
在这里插入图片描述

图相关算法

  1. 普里姆算法
  2. 克鲁斯卡尔算法
  3. 迪杰斯特拉算法
  4. 弗洛伊德算法
    以上算法我都不了解,看了看名字与实现就头大,图这里先过一下,我太笨了,等以后聪明了再来学习。手动结束,over!!!!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值