所谓图(graph),是图论中基本的数学对象,包括一些顶点,和连接顶点的,这里的边只是表示顶点的连接情况,用直线或曲线表示均可。图可以分为有向图无向图,有向图中的边是有方向的,而无向图的边是双向连通的。

存图

当图为稀疏图时,更适宜选择邻接表作为存储结构。当图为稠密图时,使用邻接矩阵作为存储结构较为合适。

链式前向星

链式前向星,由Malas命名,是除了邻接表和邻接矩阵外的另一种稍稍不同的数据结构。要了解它,首先要知道什么是前向星。前向星,Forward Star,说实话在网上资料不是非常多,在外网也是如此。看了点资料,一个点的前向星是由这个点出发的边的集合。也有中文博客提到前向星存点可以用pair<int,int>G[MAXN_E]的方式,其中每个pair保存的是起始点和中止点的编号。记录好后以起点编号为第一关键字,终点编号为第二关键字升序排序。还需要两个数组,head[i]代表以i起点的边集的开始的下标,len[i]代表以i为起点的边集的大小。这样用首地址+偏移量的方式,就可以遍历图了。

我们输入边的顺序为:

用pair存储并排序后得到

head数组和len数组为:

而链式前向星用了以下结构:

同样的,edge[i]表示第i条边;head[i]存以i为起点的第一条边的下标(在edge[]中的下标),初值赋为-1

插入的时候由于采用头插的方式,因此插入时next即为上一条边,而遍历时由于从头开始遍历,因此next确实是下一条边。即存图顺序或者说是遍历顺序是相反的。

该数据结构还有一些特性,如可以通过与1的异或运算(i^1)得到其反向边等,这里就不多说了。

最后更新于

这有帮助吗?