常用存图方式
邻接矩阵
使用于边数较多的稠密图
1 | // 邻接矩阵数组:w[a][b] = c 代表从 a 到 b 有权重为 c 的边 |
邻接表
与数组存储单链表的实现一致(头插法),又称链式前向星存图,适用于边数较少的稀疏图
1 | int[] he = new int[N], e = new int[M], ne = new int[M], w = new int[M]; |
其中,N
为节点个数,M
为边的个数
he
数组:存储是某个节点所对应的边的集合(链表)的头结点;e
数组:存储访问某一条边指向的节点;ne
数组:用于找到下一条边;w
数组:用于记录某条边的权重
当我们想遍历由a
点出发的边时,可以使用如下方法:
1 | for (int i = he[a]; i != -1; i = ne[i]) { |
邻接表(Map实现)
仅适用于无权图
1 | Map<Integer, List<Integer>> adj = new HashMap<>(); |
类
这是一种最简单,但是相比上述两种存图方式,使用得较少的存图方式。
只有当我们需要确保某个操作复杂度严格为$O(M)$时,才会考虑使用。
1 | class Edge { |
通常我们会使用 List
存起所有的边对象,并在需要遍历所有边的时候,进行遍历:
1 | List<Edge> es = new ArrayList<>(); |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 byu_rself!
评论