图论总结
题单。
树
最近公共祖先(LCA)
这是树上一个重要的点,分为三种方式。
倍增
这是最常用的一种方法,因为倍增的良好性质,我们可以在
tarjan
使用 tarjan,是在离线下,以
欧拉序+ST 表
以
树链剖分
树链剖分的常规操作,常数较小。
树链剖分
分为重链剖分,长链剖分,多为重链剖分。
树上每个节点都属于且仅属于一条重链。一颗子树内的 DFS 序是连续的。
可以发现,当我们向下经过一条轻边时,所在子树的大小至少会除以二。
因此,对于树上的任意一条路径,把它拆分成从 LCA 分别向两边往下走,分别最多走
由于每一条重链的
题目多可在序列上用线段树解决,转化为树上时即可用树链剖分,以
树上启发式合并(DSU)
DSU 运用了重儿子的性质,用一种相对暴力的方法,以
具体流程:
- 先遍历
的轻(非重)儿子,并计算答案,但不保留遍历后它对 数组的影响; - 遍历它的重儿子,保留它对
数组的影响; - 再次遍历
的轻儿子的子树结点,加入这些结点的贡献,以得到 的答案。
树上差分
树上差分可以维护树上路径的修改,并且时间复杂度为优秀的
将路径分为两段
最后答案统计子树的总和即可。
点分治
对于树径上的
图
拓扑排序
拓扑排序可以应用于有向无环图上的树形 DP,以及处理其上的前后影响问题。
可用于节点间有有向的影响的题目。
最小生成树
最小生成树就是一张图的边权和最小的生成树。
最小生成树可以使用:
Prim 算法
使用贪心为主要思想,不断添加节点,类似于一个迪杰斯特拉。
Kruskal 算法
以边为中心,逐条边判断是否可以加入,有使用一定程度上的贪心,实现上使用并查集实现。
Kruskal 重构树
将整个最小生成树以边为节点重构,做法类似于哈夫曼树。
同时在重构树上跑 LCA,可以在
最短路
即为求两点之间最短路径。
在边权相近时,可以使用 bfs(时间复杂度:
在负权时,我们可以使用 spfa,(时间复杂度:
在正常情况下,使用 Dijkstra ,(不加堆优化
在全源最短路下,方便的使用 Floyd 。
时间有约束,使用 n 遍迪杰斯特拉。
有负权边:Johnson。
以至于,我们可以用最短路树来维护复杂一点的问题。
用矩阵形式 floyd 实现求
连通分量(Tarjan)
膜拜tarjan。
点双,边双,强连通分量。
考法(摘自大佬pdf):
- 点双连通分量
圆方树 相关树上算法 - 边双连通分量
树 相关树上算法 - 强连通分量
DAG DAG 上动态规划(多为拓扑排序)。
tarjan 多应用于连通型问题,在缩点后以及转化为圆方树后的树形结构适用于多种解法。
2-SAT
算是 tarjan 底下的东西吧,2-SAT 主要适用于一些若干条语句,可能产生矛盾的,并且是双面型的东西。
适用于标准的 2-SAT 模板,以及相似的构造题。
二分图
二分图是可以将节点分成由两个集合组成,且两个集合内部没有边的图。
二分图有许多优秀的性质,我们多用染色法判断该图是否是一个二分图,使用增广路算法来解决二分图上的最大匹配问题,同时这也是在使用上最频繁的二分图算法。
二分图可以用来解决
二分图不仅仅用于显然的二分图,同时多以用来解决在网格图上的行列上的矛盾,占有问题,并且可以给出其中一组方案。
欧拉路问题
欧拉路亦可称为一笔画问题。
但是我们实际上并不只有一笔画,亦可以多笔画,这需要我们将所有的奇数节点两两匹配、连边,转化成最普通的欧拉回路。
在算法上,多使用 dfs 来解决,并且或是删结尾边,或是提高起始点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现