数据结构与算法:图的基础以及遍历代码实现

数据结构与算法:图的基础以及遍历代码实现

编辑

一、图定义

图是一种较线性表和树更为复杂的数据结构,其定义为:

图是由顶点的有穷非空集合与顶点之间边的集合构成,通常表示为:G(V, E), G表示一个图,V表示图中顶点的集合,E表示顶点之间边的集合。

如下,就是一个图:

数据结构与算法:图的基础以及遍历代码实现

编辑

二、图术语了解

图中数据元素我们称之为顶点,图中任意两个顶点都可能存在关系,顶点之间关系用边来表示。

若两个顶点Vi与Vj之间的边没有方向,则称这条边为无向边, 用(Vi,Vj)表示,注意这里是圆括号

如果图中任意顶点之间都是无向边,则称该图为无向图,在无向图中任意两个顶点之间都存在边,则称该图为无向完全图,上图就是一个无向完全图。

若两个顶点Vi与Vj之间的边有方向,则称这条边为有向边,也称作弧, 用

如果图中任意顶点之间都是有向边,则称该图为有向图,在有向图中任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图,如下图:

数据结构与算法:图的基础以及遍历代码实现

编辑

有些图的边或者弧具有与其相关的数字,这种与图或弧相关的数字叫做权值。

在无向图中如果两个顶点之间有路径,则称这两个顶点是联通的,如果图中任意两个顶点都是联通的,则称图是连通图。

在无向图中顶点的边数叫做顶点的度。

在有向图中顶点分为出度和入度,入度就是指向自己的边数,而出度则相反。

如下图:

数据结构与算法:图的基础以及遍历代码实现

A结点:出度为3,入度为1

编辑

B结点:出度为1,入度为2

以上讲解了一些图的基本术语,没什么难度,大概了解一下就可以了。

三、图的存储

图的结构比较复杂,任意两个元素都可能产生关系,所以一般存储结构无法满足。

邻接矩阵存储方式

图是由顶点和边(或者弧)组成的,可以单独存储顶点和边,顶点简单,可以用一位数组来存储,但是边呢?边就是两个顶点之间的关系,可以用一个二维数组来存储,这种存储方式就是邻接矩阵存储方式。

邻接矩阵存储方式就是用两个数组来存储,一个一维数组,一个二维数组,一维数组用来存储顶点,二维数组用来存储顶点之间的关系,也就是边或者弧。

无向图邻接矩阵存储方式:

如下无向图:

数据结构与算法:图的基础以及遍历代码实现

编辑

一维数组存储顶点数组:

数据结构与算法:图的基础以及遍历代码实现

编辑

二维数组存储顶点(边,弧)之间关系:

数据结构与算法:图的基础以及遍历代码实现

编辑

无向图边之间关系的二维数组用0或者1来填充,如果两个顶点之间直接连通则为1,不直接连通则为0,有个注意点就是直接不是间接连通。比如A与B之间直接连通所以填1,而A与D之间不直接连通则为0.

有向图邻接矩阵存储方式:

如下有向图:

数据结构与算法:图的基础以及遍历代码实现

编辑

存储顶点的一维数组与上面一样

二维数组存储顶点(边,弧)之间关系:

数据结构与算法:图的基础以及遍历代码实现

编辑

无向图中两个顶点之间有直接相连的边则为1,而有向图中如上图中B与C之间,有B指向C的边则为1,而没有C指向B的边则为0。

带权邻接矩阵存储方式:

如下图有向带权图:

数据结构与算法:图的基础以及遍历代码实现

编辑

存储顶点的一维数组与上面一样

二维数组存储顶点(边,弧)之间关系:

数据结构与算法:图的基础以及遍历代码实现

编辑

很简单,就是将有向图中1替换为对应权值,此外,如图中A,C之间,没有A指向C的边则用∞表示。

对于带权有向图将各个顶点理解成一个个村庄,边就是村庄之间的路,权值就是距离,AB村庄之间有A指向B的路程,并且路程是100,则二维数组中直接用100表示,BA之间没有路,则用无穷大表示,代表永远不可达,自己到自己就是0了。


分享到:


相關文章: