知人者智,自知者明。人之所以痛苦,是因为无法跨越知道和做到的鸿沟。所以,我们要知道自己能做什么。
定义
图的范围比较广,类似下图
其实树,栈,队列也可以看做是一种特殊的图。图由一些点与线组合而成,我们称这些点为顶点,这些线为边或者弧。本质上图就是通过线来描述各个点之间的关系。图大类分为有向图与无向图。
存储方式
图有很多中存储方式,
- 数组 + 二维数组存储
通过顶点存在数组里面,二维数组内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的指向是一个链表,以此建立关系,不得不说,这个图看起来非常抽象难懂,我自己也画了好久,看视频加上自己理解来的,可能看不太懂,我也很难解释,后来发现还有其他文章说得很清楚,后续再重新写写邻接多重表。这里就偷个懒了。
边集数组
边集数组是最简单的了,用两个一维数组来存储,一个数据里面存顶点,另一个存边起始与结束顶点下标。黄色为权重,也可以加上。
图相关算法
- 普里姆算法
- 克鲁斯卡尔算法
- 迪杰斯特拉算法
- 弗洛伊德算法
以上算法我都不了解,看了看名字与实现就头大,图这里先过一下,我太笨了,等以后聪明了再来学习。手动结束,over!!!!