数据结构——图及算法简介(二)

图(graph):是一种较线性表和树更为复杂的数据结构,图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关 
线性表:数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继 
树:树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关

 

图分为有向图、无向图,无向图由定点和边组成,有向图有顶点和弧组成,弧分为弧头、弧尾。

图按照节点和边(弧)的多少分为,稀疏图、稠密图,这两者没有具体界定只是个人感觉概念。任意两个顶点之间都存在边就叫完全图,有向的叫有向完全图,无重复的边或者顶点到自身的边叫简单图。

顶点之间有邻接点、依附概念。无向图顶点的边数叫度,有向图分为入度、出度。

图上的边、弧带有权的叫网

顶点直接存在路径,两顶点直接存在路径就说明是连通的。如果路径能回到最初点就叫环,不重复的叫简单路径。任意两点都是连通的叫连通图,有向的叫强连通图。图中若包含子图,子图的最大连通就是连通分量,有向的称为强连通分量。

无向图中,连通且n个点,n-1条边叫生成树。有向图中一顶点入度为0其余顶点入度为1叫有向树,一个图由若干条有向树组成叫生成森林。

 

图的存储方式:

1、邻接矩阵存储又称为二维数组存储:图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息

如下图,横向为入度,竖向为出度。所以图中横向的V1出度为2,竖向V1出度为1。

《数据结构——图及算法简介(二)》

 

每条边上带权的图就叫网,下列就是一个有向网图。图中V0到V4得弧上有数字6.这就是一条带权的边。所以下列左边的图为一个有向网图

《数据结构——图及算法简介(二)》

 

 

 

 

2、邻接表存储法:数组与链表相结合的存储方法

 

接下来创建邻接矩阵,其实就是给顶点表和边表输入数据的过程。

邻接矩阵是一个不错的存储方式,但是如果一个图里只有一条有权的边呢?那整个矩阵之中只有一个是有值得其他都为空,这样就大大的浪费了空间资源。

所以我们想出了新的办法:邻接表

《数据结构——图及算法简介(二)》

至于存储带权值的的网图,就再定义一份数据域存储权值即可。

3、十字链表存储法

 

邻接表是由缺陷的,关心了出度问题想了解入度就必须全部遍历才可以。反之,逆邻接表解决了入度却不了解出度的情况,那么有没有办法把邻接表和逆邻接表结合起来?

那就是十字链表:

《数据结构——图及算法简介(二)》

上图就是十字链表,看起来比较杂乱,但是,很好理解。以V1为例,一块空间指向1 0 和 1 2是出度,一块指向 2 1 是入度。这样就做到同时指向两块关系内存了。

 

下面是邻接多重表:

如果在无向图中,我们关注的是顶点,那此时用邻接多重表是不错的选择。

ivex和jvex是某条边的两个顶点,ilink和jlink是指向ivex和jvex的吓一条边。

《数据结构——图及算法简介(二)》

最后一个方法是边集数组:

是从begin开始到end得一条边,权为weight。

《数据结构——图及算法简介(二)》

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/szss/p/9636296.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞