2024/06/14记录
今日计划
- 完成阅读《图解TCP/IP》的第二章,尽可能的完成笔记
- 学习图论最短路算法
- 推进项目
算法小计
存储图的三种方式
设 m = 边的数量,n = 点的数量
邻接矩阵 : 适用于 边的数量接近点的数量的平方的情况 $m \approx n^2$
// 邻接矩阵数组:w[a][b] = c 代表从 a 到 b 有权重为 c 的边 |
邻接表:适用于 边的数量接近点的数量的情况 $m \approx n$
int[] he = new int[N], e = new int[M], ne = new int[M], w = new int[M]; |
首先 idx
是用来对边进行编号的,然后对存图用到的几个数组作简单解释:
he
数组:存储是某个节点所对应的边的集合(链表)的头结点;e
数组:由于访问某一条边指向的节点;ne
数组:由于是以链表的形式进行存边,该数组就是用于找到下一条边;w
数组:用于记录某条边的权重为多少。
因此当我们想要遍历所有由 a
点发出的边时,可以使用如下方式:
for (int i = he[a]; i != -1; i = ne[i]) { |
类
这是一种最简单,但是相比上述两种存图方式,使用得较少的存图方式。
只有当我们需要确保某个操作复杂度严格为$O(m)$时,才会考虑使用
具体的,我们建立一个类来记录有向边信息:
class Edge { |
通常我们会使用 List 存起所有的边对象,并在需要遍历所有边的时候,进行遍历:
List<Edge> es = new ArrayList<>(); |
分析:约定边的数量为 m 点的数量 为 n
查看数据范围,n的范围是100,m的范围是6000,使用邻接表 或者 邻接矩阵都可以
本题要求的是 从 k 点出发,所有点都被访问到的最短时间,问题转换一下就是 求从 k 点出发,到其他点x的最短距离的最大值
第一种最短路:
Floyd (邻接矩阵) 时间复杂度 $O(n^3)$
第一遍 Floyd,可以得到从任意起点出发,到达任意点的最短距离
然后从所有 $w[k][x]$中取出最大值
class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment