邻接表
定义
邻接矩阵一定需要去开辟n×nn \times nn×n 的空间,当一个题目的顶点数量n>105n > 10^5n>105 在一个数组当中是无法开辟这么大的空间的。因此,我们需要使用邻接表来存储图的结构。
邻接表的优势
1. 空间复杂度:对于一个有nnn个顶点的图,mmm条边的一张图,邻接表只需要O(n+m)O(n+m)O(n+m)的空间,其中mmm是边的数量。
2. 插入和删除操作:对于邻接表来说,插入和删除操作的时间复杂度都是O(1)O(1)O(1)。
3. 稀疏图:对于一个稀疏图来说,邻接表的存储空间可以大大减少。
邻接表的实现
邻接表相当于是nnn条链表的集合,每个链表存储了与某个顶点相连接的其他顶点。
比如,链表数组的名称为mpmpmp,对于顶点vvv,mp[v]mp[v]mp[v]指向一个链表,链表中存储了与vvv相连接的其他顶点。
假如与点vvv相连接的顶点有1,2,31,2,31,2,3,那么mp[v]mp[v]mp[v]中存储的就是1,2,31,2,31,2,3。
如果需要储存权值,只需要将链表当中的每一个空间划分为两个部分,第一个部分存储顶点,第二个部分存储权值。
1. 使用指针来去实现链表,构成一个邻接表。 动态链表的实现,删除和插入的操作都为O(1)。
2. 使用vector来代表其中的链表,构成一个邻接表。 静态链表,删除操作为O(n),插入操作为O(1)。