图论总结
题单。
树
最近公共祖先(LCA)
这是树上一个重要的点,分为三种方式。
倍增
这是最常用的一种方法,因为倍增的良好性质,我们可以在 \(\log n\) 级别的时间复杂度下解决该问题,并且同时可以维护许多树链上的指定长度的问题,延展性极佳。
tarjan
使用 tarjan,是在离线下,以 \(O(n)\) 的时间复杂度,使用并查集,解决若干 LCA 问题,但是由于其需要离线的性质,因此并不常用,仅在需要优化大量 LCA 时会考虑使用。
欧拉序+ST 表
以 \(O(n)\) 的时间复杂度,处理出树的欧拉序以及在 \(O(n\log n)\) 的复杂度下,处理出 ST 表,维护区间最小值,以及其 \(id\)。
树链剖分
树链剖分的常规操作,常数较小。
树链剖分
分为重链剖分,长链剖分,多为重链剖分。
树上每个节点都属于且仅属于一条重链。一颗子树内的 DFS 序是连续的。
可以发现,当我们向下经过一条轻边时,所在子树的大小至少会除以二。
因此,对于树上的任意一条路径,把它拆分成从 LCA 分别向两边往下走,分别最多走 \(O(\log n)\) 次,因此,树上的每条路径都可以被拆分成不超过 \(O(\log n)\) 条重链。
由于每一条重链的 \(dfs\) 序是连续的,因此,我们常用线段树的区间修改,查询解决问题。
题目多可在序列上用线段树解决,转化为树上时即可用树链剖分,以 \(O(n\log^2n)\) 的时间复杂度。
树上启发式合并(DSU)
DSU 运用了重儿子的性质,用一种相对暴力的方法,以 \(n\log n\) 的时间复杂度解决。
具体流程:
- 先遍历 \(u\) 的轻(非重)儿子,并计算答案,但不保留遍历后它对 \(cnt\) 数组的影响;
- 遍历它的重儿子,保留它对 \(cnt\) 数组的影响;
- 再次遍历 \(u\) 的轻儿子的子树结点,加入这些结点的贡献,以得到 \(u\) 的答案。
树上差分
树上差分可以维护树上路径的修改,并且时间复杂度为优秀的 \(O(n)\)。
将路径分为两段 \(u \to lca\) 与 \(v \to lca\),用类似于差分的方式修改。
最后答案统计子树的总和即可。
点分治
对于树径上的
图
拓扑排序
拓扑排序可以应用于有向无环图上的树形 DP,以及处理其上的前后影响问题。
可用于节点间有有向的影响的题目。
最小生成树
最小生成树就是一张图的边权和最小的生成树。
最小生成树可以使用:
Prim 算法
使用贪心为主要思想,不断添加节点,类似于一个迪杰斯特拉。
Kruskal 算法
以边为中心,逐条边判断是否可以加入,有使用一定程度上的贪心,实现上使用并查集实现。
Kruskal 重构树
将整个最小生成树以边为节点重构,做法类似于哈夫曼树。
同时在重构树上跑 LCA,可以在 $\log $ 的时间复杂度下解决两点之间路径的最大值或最小值(若用 tarjan 跑 LCA 可至 \(O(n)\),用 ST 表预处理,每个查询 \(O(1)\))。
最短路
即为求两点之间最短路径。
在边权相近时,可以使用 bfs(时间复杂度:\(n\))。
在负权时,我们可以使用 spfa,(时间复杂度:\(n\log n\sim n^2\))
在正常情况下,使用 Dijkstra ,(不加堆优化 \(O(n^2)\),堆优化时间复杂度:\(m\log m\))。
在全源最短路下,方便的使用 Floyd 。
时间有约束,使用 n 遍迪杰斯特拉。
有负权边:Johnson。
以至于,我们可以用最短路树来维护复杂一点的问题。
用矩阵形式 floyd 实现求 \(k\) 步方案。
连通分量(Tarjan)
膜拜tarjan。
点双,边双,强连通分量。
考法(摘自大佬pdf):
- 点双连通分量 $\Rightarrow $ 圆方树 $\Rightarrow $ 相关树上算法
- 边双连通分量 $\Rightarrow $ 树 $\Rightarrow $ 相关树上算法
- 强连通分量 $\Rightarrow $ DAG $\Rightarrow $ DAG 上动态规划(多为拓扑排序)。
tarjan 多应用于连通型问题,在缩点后以及转化为圆方树后的树形结构适用于多种解法。
2-SAT
算是 tarjan 底下的东西吧,2-SAT 主要适用于一些若干条语句,可能产生矛盾的,并且是双面型的东西。
适用于标准的 2-SAT 模板,以及相似的构造题。
二分图
二分图是可以将节点分成由两个集合组成,且两个集合内部没有边的图。
二分图有许多优秀的性质,我们多用染色法判断该图是否是一个二分图,使用增广路算法来解决二分图上的最大匹配问题,同时这也是在使用上最频繁的二分图算法。
二分图可以用来解决
二分图不仅仅用于显然的二分图,同时多以用来解决在网格图上的行列上的矛盾,占有问题,并且可以给出其中一组方案。
欧拉路问题
欧拉路亦可称为一笔画问题。
但是我们实际上并不只有一笔画,亦可以多笔画,这需要我们将所有的奇数节点两两匹配、连边,转化成最普通的欧拉回路。
在算法上,多使用 dfs 来解决,并且或是删结尾边,或是提高起始点。

浙公网安备 33010602011771号