
图的表示方法
本篇将介绍图的四种表示方法
直接存边
使用结构体或者数组直接存边:
1 | struct edge { |
复杂度
- 查询一条边:
- 遍历一个点的所有出边:
- 遍历整张图:
- 空间复杂度:
可以看出,这个存图方式导致如果你想要找到其中一条边的参数,需要遍历整张图才可以获得
太过缓慢了,除非是像 Kruskal 中这种需要按边权来排序的才比较方便
邻接矩阵
顾名思义,使用一个二维矩阵 来表示从 到 的一条边的参数
1 | struct edge { |
复杂度
- 查询一条边:
- 遍历一个点的所有出边:
- 遍历整张图:
- 空间复杂度:
邻接矩阵仅适用于图中没有重边的情况
其最显著的优点是查询边只需要 即可完成,最大的困难是需要占用 的空间,在稀疏图上效率较低
邻接表
使用 动态数组来存储边的信息
1 | struct node { |
复杂度
- 查询一条边:
- 遍历一个点的所有出边:
- 遍历整张图:
- 空间复杂度:
由于其中规中矩的性质以及高效率的空间使用,大多数情况存图我们都选择邻接表
链式前向星
通过手写链表,来组成一张图
1 | int h[N], e[N], f[N], ne[N], idx; |
复杂度
- 查询一条边:
- 遍历点u的所有出边:
- 遍历整张图:
- 空间复杂度:
链式前向星拥有非常优秀的性质,任何图都可以用这个存
他不能快速查询一条边是否存在,也不方便排序,所以通常我们仍然使用邻接表
但是当我们需要存反向边时,可以通过 i^1 快速访问,这点在 网络流 中被灵活运用
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自MarkCup
评论 ()


