跳转至

存图

讨论有向图与无向图的存储方式,以实现各类图论算法。

邻接表

顶点表与链表组成的数据结构。每个顶点作为链表的头,存储相连的边。适合稀疏图。查询两个顶点间是否有边困难。

链式前向星

数组模拟邻接表,因实现容易广泛用于竞赛,且由于边带有编号的性质,有时很有用,如获取反边。

邻接矩阵

二维矩阵,\(A[i][j]\) 有值 = \(i\)\(j\) 有边。适合稠密图。无向图 \(A[i][j]=A[j][i]\),可以压缩存储,节省一半空间。删除顶点困难。

只有邻接矩阵表示方式唯一。

十字链表

存有向图,解决了邻接表顶点入度计算困难的问题。每个顶点同时存入边和出边表。与邻接表对应,如果说邻接表只存了出边(顶点 \(v\) 的指针存的链表是以该点为起点的所有边),那么十字链表还存了入边,即以顶点 \(v\) 为终点的所有边。一条边只存一次,所以这条边的头尾顶点都是可以确定的,且头顶点的出边表指向这条边,尾顶点的入边表也指向这条边。

顶点定义:

| data | firstIn | firstOut |

边定义:

| tailvex | headvex | hlink | tlink | info |

既然邻接表求出度方便(即链表长度),那么十字链表求入度方便是显然的。

邻接多重表

存无向图,解决了邻接表存无向图时需要存两条边,删改边需要同时修改两条边的问题。每条边只存一次,但同时存头尾顶点,用两个指针分别指向两个顶点的下一条边。对应邻接表只存储一个方向的边,邻接多重表通过添加指针的方式让两个顶点地位相同。

顶点定义:

| data | firstedge |

边定义:

| mark | ivex | jvex | ilink | jlink | info |

由于一条边只存一次,删改都只要对一个对象操作。