把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

图论总结

题单

最近公共祖先(LCA)

这是树上一个重要的点,分为三种方式。

倍增

这是最常用的一种方法,因为倍增的良好性质,我们可以在 logn 级别的时间复杂度下解决该问题,并且同时可以维护许多树链上的指定长度的问题,延展性极佳。

tarjan

使用 tarjan,是在离线下,以 O(n) 的时间复杂度,使用并查集,解决若干 LCA 问题,但是由于其需要离线的性质,因此并不常用,仅在需要优化大量 LCA 时会考虑使用。

欧拉序+ST 表

O(n) 的时间复杂度,处理出树的欧拉序以及在 O(nlogn) 的复杂度下,处理出 ST 表,维护区间最小值,以及其 id

树链剖分

树链剖分的常规操作,常数较小。

OI-Wiki

树链剖分

分为重链剖分,长链剖分,多为重链剖分。

树上每个节点都属于且仅属于一条重链。一颗子树内的 DFS 序是连续的。

可以发现,当我们向下经过一条轻边时,所在子树的大小至少会除以二。

因此,对于树上的任意一条路径,把它拆分成从 LCA 分别向两边往下走,分别最多走 O(logn) 次,因此,树上的每条路径都可以被拆分成不超过 O(logn) 条重链。

由于每一条重链的 dfs 序是连续的,因此,我们常用线段树的区间修改,查询解决问题。

题目多可在序列上用线段树解决,转化为树上时即可用树链剖分,以 O(nlog2n) 的时间复杂度。

树上启发式合并(DSU)

DSU 运用了重儿子的性质,用一种相对暴力的方法,以 nlogn 的时间复杂度解决。
具体流程:

  1. 先遍历 u 的轻(非重)儿子,并计算答案,但不保留遍历后它对 cnt 数组的影响;
  2. 遍历它的重儿子,保留它对 cnt 数组的影响;
  3. 再次遍历 u 的轻儿子的子树结点,加入这些结点的贡献,以得到 u 的答案。

树上差分

树上差分可以维护树上路径的修改,并且时间复杂度为优秀的 O(n)

将路径分为两段 ulcavlca,用类似于差分的方式修改。

最后答案统计子树的总和即可。

点分治

对于树径上的

拓扑排序

拓扑排序可以应用于有向无环图上的树形 DP,以及处理其上的前后影响问题。
可用于节点间有有向的影响的题目。

最小生成树

最小生成树就是一张图的边权和最小的生成树。
最小生成树可以使用:

Prim 算法

使用贪心为主要思想,不断添加节点,类似于一个迪杰斯特拉。

Kruskal 算法

以边为中心,逐条边判断是否可以加入,有使用一定程度上的贪心,实现上使用并查集实现。

Kruskal 重构树

将整个最小生成树以边为节点重构,做法类似于哈夫曼树。
同时在重构树上跑 LCA,可以在 log 的时间复杂度下解决两点之间路径的最大值或最小值(若用 tarjan 跑 LCA 可至 O(n),用 ST 表预处理,每个查询 O(1))。

OI-Wiki

最短路

即为求两点之间最短路径。
在边权相近时,可以使用 bfs(时间复杂度:n)。
在负权时,我们可以使用 spfa,(时间复杂度:nlognn2
在正常情况下,使用 Dijkstra ,(不加堆优化 O(n2),堆优化时间复杂度:mlogm)。
在全源最短路下,方便的使用 Floyd
时间有约束,使用 n 遍迪杰斯特拉。
有负权边:Johnson

以至于,我们可以用最短路树来维护复杂一点的问题。
用矩阵形式 floyd 实现求 k 步方案。

OI-Wiki

连通分量(Tarjan)

膜拜tarjan
点双,边双,强连通分量。
考法(摘自大佬pdf):

  • 点双连通分量 圆方树 相关树上算法
  • 边双连通分量 相关树上算法
  • 强连通分量 DAG DAG 上动态规划(多为拓扑排序)。

tarjan 多应用于连通型问题,在缩点后以及转化为圆方树后的树形结构适用于多种解法。

2-SAT

算是 tarjan 底下的东西吧,2-SAT 主要适用于一些若干条语句,可能产生矛盾的,并且是双面型的东西。
适用于标准的 2-SAT 模板,以及相似的构造题。

OI-Wiki

二分图

二分图是可以将节点分成由两个集合组成,且两个集合内部没有边的图。
二分图有许多优秀的性质,我们多用染色法判断该图是否是一个二分图,使用增广路算法来解决二分图上的最大匹配问题,同时这也是在使用上最频繁的二分图算法。

二分图可以用来解决

  1. 二分图上最大匹配问题
  2. 二分图最大权匹配

二分图不仅仅用于显然的二分图,同时多以用来解决在网格图上的行列上的矛盾,占有问题,并且可以给出其中一组方案。

欧拉路问题

欧拉路亦可称为一笔画问题。

但是我们实际上并不只有一笔画,亦可以多笔画,这需要我们将所有的奇数节点两两匹配、连边,转化成最普通的欧拉回路。

在算法上,多使用 dfs 来解决,并且或是删结尾边,或是提高起始点。

OI-Wiki

。。。

posted @   djh0314  阅读(19)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示