随笔分类 -  图论

1
摘要:建最小生成树还有一个基于并查集的算法——kruskal算法 它的思路是从小到大枚举所有的边,如果这条边的两点的老祖宗不相等,这两点至少有一个不在树中,我们就把它算进去 时间复杂度是O(mlogm),和H-prim一样。两者都适合用在稀疏图中,prim适合在稠密图 例题 洛谷 P3366 【模板】最小 阅读全文
posted @ 2023-07-29 15:20 eternal_visionary 阅读(20) 评论(0) 推荐(0)
摘要:知道了prim最小生成树算法,我们发现每次找距离最小的点的操作和dijkstra算法中的操作很像,所以我们考虑是否可以将迪杰的优化套到prim上,即用堆优化 时间复杂度大概是O(mlogm) 例题:洛谷 P3366 【模板】最小生成树 ``` #include #include #include # 阅读全文
posted @ 2023-07-29 15:13 eternal_visionary 阅读(37) 评论(0) 推荐(0)
摘要:最小生成树,也就是对一个无向图,找到其中边权和最小的树 prim算法的思路就是每次找离当前生成树距离最小的点,逐渐扩大生成树的规模 时间复杂度差不多是O(n^2) 例题:洛谷 P3366 【模板】最小生成树 ``` #include #include #include #include #defin 阅读全文
posted @ 2023-07-29 15:10 eternal_visionary 阅读(37) 评论(0) 推荐(0)
摘要:单源最短路 | | Bellman-Ford | SPFA | Dijkstra | H-Dijkstra | | | | | | | | 思路 | 遍历全边,直到不变 | 宽搜渐进,入队再更 | 找最近点,更新邻点,找完不再用 | 取负入队,大根堆找点,其余相同 | | 负边权 | 能 | 能 | 阅读全文
posted @ 2023-05-24 20:37 eternal_visionary 阅读(26) 评论(0) 推荐(0)
摘要:全源最短路,换一种说法就是n个单源最短路,可以用n次Bellman-Ford或SPFA,非负边权还可以用Dijkstra,可是有负边权用前两个算法还是慢,如果我们能把负边权映射成非负边权的话,一切就都好办了 这里我们引入一个虚拟结点,它和所有点的初始距离都是0,然后,我们求出来这个结点和其他店的最短 阅读全文
posted @ 2023-05-24 20:09 eternal_visionary 阅读(38) 评论(0) 推荐(0)
摘要:全源最短路,顾名思义,就是任意两点之间的最短路 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 阅读(51) 评论(0) 推荐(0)
摘要:对普通的Dijkstra,每次要找到没有标记的距离最短的点显然很麻烦,所以不如做一个单调队列,每次取堆顶就行了,由查找的n变成进堆的logn,个人简称H-Dijkstra 时间复杂度有说 O(mlogn)也有一点O(mlogm)的,不过问题不大,基本是比SPFA要快的 #include<iostre 阅读全文
posted @ 2023-05-24 00:20 eternal_visionary 阅读(47) 评论(0) 推荐(0)
摘要:Dijkstra算法是对非负边权特攻的最短路算法,既然是非负边权,那么在还没有确定最短路的点中和原点距离最近的点一定是这个点最短路,因为其他点的距离更远,不可能通过绕圈来更新它,那么每次用这类点来更新这类点的邻点即可 时间复杂度我看到很多不一样的,有点混,我认为所有边都能遍历一次,要定n轮,每轮找n 阅读全文
posted @ 2023-05-23 23:20 eternal_visionary 阅读(40) 评论(0) 推荐(0)
摘要:Bellman-Ford算法的一个问题是,每一轮都会遍历所有的边,其中很多边都是不可能被更新的,显然只有在一轮中被更新过的边才有可能使它的相邻边更新,由这个原则,我们可以用队列存入更新过的边的点,每次对它的临边进行松弛操作 时间复杂度O(km~nm),k是每个点平均进队次数,在稀疏图中比较小,但在稠 阅读全文
posted @ 2023-05-23 23:06 eternal_visionary 阅读(48) 评论(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 阅读(33) 评论(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 阅读(71) 评论(0) 推荐(0)
摘要:现知LCA算法有倍增、Tarjan、树链剖分 再LCA问题上各自的特点如下表 | | 倍增 | Tarjan | 树链剖分 | RMQ | | : : | : : | : : | : : | : : | | 数组 | fa[u][i], dep | fa, vis, query, ans | fa, 阅读全文
posted @ 2023-05-03 21:31 eternal_visionary 阅读(27) 评论(0) 推荐(0)
摘要:例题:洛谷P3379 【模板】最近公共祖先(LCA) https://www.luogu.com.cn/problem/P3379 首先是几个概念 重儿子:父结点所有子树中最大的子树的根节点(只有一个或没有) 轻儿子:父结点除了重儿子以外的所有子结点(没有或有很多个) 重边:父结点和重儿子连的边 轻 阅读全文
posted @ 2023-05-03 21:13 eternal_visionary 阅读(43) 评论(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 阅读(68) 评论(0) 推荐(0)
摘要:求最近公共祖先(Lowest Common Ancestor,LCA) 例题:洛谷P3379 【模板】最近公共祖先(LCA) https://www.luogu.com.cn/problem/P3379 基本思路就是先用倍增把两点升到同一深度,然后倍增来找最近公共祖先。 其中fa数组是关键,时间复杂 阅读全文
posted @ 2023-05-01 17:47 eternal_visionary 阅读(51) 评论(0) 推荐(0)

1