摘要: 全源最短路,顾名思义,就是任意两点之间的最短路 floyed的思路就是每次选一个点k,如果k不在u和v路径上,就不改变,如果k在u和v的路径上,进行松弛操作d[u][v]=min(d[u][v],d[u][k]+d[k][v]) 例题 洛谷 B3647 【模板】Floyd 算法 ``` #inclu 阅读全文
posted @ 2023-05-24 19:28 eternal_visionary 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 对普通的Dijkstra,每次要找到没有标记的距离最短的点显然很麻烦,所以不如做一个单调队列,每次取堆顶就行了,由查找的n变成进堆的logn,个人简称H-Dijkstra 时间复杂度有说 O(mlogn)也有一点O(mlogm)的,不过问题不大,基本是比SPFA要快的 #include<iostre 阅读全文
posted @ 2023-05-24 00:20 eternal_visionary 阅读(25) 评论(0) 推荐(0) 编辑
摘要: Dijkstra算法是对非负边权特攻的最短路算法,既然是非负边权,那么在还没有确定最短路的点中和原点距离最近的点一定是这个点最短路,因为其他点的距离更远,不可能通过绕圈来更新它,那么每次用这类点来更新这类点的邻点即可 时间复杂度我看到很多不一样的,有点混,我认为所有边都能遍历一次,要定n轮,每轮找n 阅读全文
posted @ 2023-05-23 23:20 eternal_visionary 阅读(20) 评论(0) 推荐(0) 编辑
摘要: Bellman-Ford算法的一个问题是,每一轮都会遍历所有的边,其中很多边都是不可能被更新的,显然只有在一轮中被更新过的边才有可能使它的相邻边更新,由这个原则,我们可以用队列存入更新过的边的点,每次对它的临边进行松弛操作 时间复杂度O(km~nm),k是每个点平均进队次数,在稀疏图中比较小,但在稠 阅读全文
posted @ 2023-05-23 23:06 eternal_visionary 阅读(20) 评论(0) 推荐(0) 编辑
摘要: 单源最短路,顾名思义,就是从一个起点到其余点的最短距离 Bellman-Ford算法的思路是进行至多n-1轮的更新,每次遍历所有的边,进行松弛操作d[v]=min(d[v],d[u]+w); 之所以至多n-1轮,是因为每次松弛操作实际上是对相邻节点的访问,第n次松弛操作保证了所有深度为n的路径最短, 阅读全文
posted @ 2023-05-23 11:40 eternal_visionary 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 就是把LCA问题转化为RMQ问题 转化之前先要了解欧拉序列:对一棵树进行 DFS,无论是第一次访问还是回溯,每次到达一个结点时都将编号记录下来,可以得到一个长度为 2n-1 的序列,这个序列被称作这棵树的欧拉序列。 比如下面这个树:(2连3和4) 1->2->3 ->4->5 其序列就是1 2 3 阅读全文
posted @ 2023-05-05 22:04 eternal_visionary 阅读(26) 评论(0) 推荐(0) 编辑
摘要: ST表的数组st[i][k]指从i开始2^k个数里的最值 最直观的用法应该就是求区间最值,即RMQ问题(Range Minimum/Maximum Query) 预处理O(nlogn) 查询O(1) 例题 洛谷P3865 【模板】ST 表 https://www.luogu.com.cn/probl 阅读全文
posted @ 2023-05-05 20:32 eternal_visionary 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 现知LCA算法有倍增、Tarjan、树链剖分 再LCA问题上各自的特点如下表 | | 倍增 | Tarjan | 树链剖分 | RMQ | | : : | : : | : : | : : | : : | | 数组 | fa[u][i], dep | fa, vis, query, ans | fa, 阅读全文
posted @ 2023-05-03 21:31 eternal_visionary 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 例题:洛谷P3379 【模板】最近公共祖先(LCA) https://www.luogu.com.cn/problem/P3379 首先是几个概念 重儿子:父结点所有子树中最大的子树的根节点(只有一个或没有) 轻儿子:父结点除了重儿子以外的所有子结点(没有或有很多个) 重边:父结点和重儿子连的边 轻 阅读全文
posted @ 2023-05-03 21:13 eternal_visionary 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 例题:洛谷P3379 【模板】最近公共祖先(LCA) https://www.luogu.com.cn/problem/P3379 tarjan算法是利用了并查集来求LCA的,时间复杂度比倍增低,是O(n+m) ``` #include #include #include #define forup 阅读全文
posted @ 2023-05-01 22:35 eternal_visionary 阅读(46) 评论(0) 推荐(0) 编辑