跳转至

算法汇总大全

明白了,你的要求是:既要覆盖所有算法大类(像第二个表格那样全),又要对每个算法都写出“在题目中的具体用途”(像第三个表格那样细)。下面是一个合并后的完整表格:


排序算法

算法 在题目中的具体用途
快速排序 一般性排序的默认选择,配合 nth_element 可用于求第 k 大/小的元素(快速选择)。
归并排序 需要稳定排序时使用;求逆序对数量(归并过程中统计);链表排序。
堆排序 实现优先队列,用于动态维护最值,如 Dijkstra 中的取最小点、多路归并中的取最小元素。
计数排序 数据范围小且为整数时,线性排序;常见于基数排序的低位排序。
基数排序 对整数或定长字符串按位排序,例如后缀数组(SA)的倍增优化中用于对二元组排序。
桶排序 数据均匀分布时线性排序,或在分块中用于维护块内元素的快速排序。

搜索算法

算法 在题目中的具体用途
DFS(深度优先搜索) 图的连通性检测(求连通块);拓扑排序的递归实现;树的重心/直径的递归求解;剪枝搜索(如八皇后、数独)。
BFS(广度优先搜索) 无权图的最短路分层遍历(如求矩阵中从起点到终点的最短步数);状态转移的最少步数(如八数码问题)。
双向 BFS 已知起点和终点的最短路搜索,状态空间爆炸时可将复杂度降至 O(b^(d/2)),如“单词接龙”、“K 步之内能否到达”。
A* 算法 有可行启发函数(如曼哈顿距离)的最短路搜索,如八数码K 短路的辅助搜索。
IDA* 结合迭代加深和 A*,用于空间受限且启发函数良好的搜索,典型如“骑士周游”或“十五数码”。
迭代加深 DFS 搜索树深度较大但答案深度较浅,且 DFS 可能陷入死循环时使用,如“埃及分数”问题。

动态规划 (DP)

算法 在题目中的具体用途
线性 DP 解决 LIS(最长上升子序列)LCS(最长公共子序列)背包问题(0/1背包、完全背包、多重背包)最大子段和 等基础序列问题。
区间 DP 区间合并或分割的最优解,如“石子合并”(最小/最大得分)、“矩阵链乘”、“回文串分割”等。
树形 DP 树上统计问题:树的直径树上最大独立集(选不相邻点的最大权)、树上背包(如“选课”问题,依赖关系形成树)、换根 DP(求每个点到所有点的距离和)。
状压 DP 状态为集合(n ≤ 20),典型应用:TSP(旅行商问题)覆盖问题(用多米诺骨牌覆盖棋盘)、分配问题(如“排列”的最优值)。
数位 DP 统计区间 [L,R] 内满足特定数字性质(如不含 4、各位和能被 K 整除、数字单调递增)的数的个数。
插头 DP 解决棋盘上的连通性状态压缩问题,如“棋盘覆盖”、“回路计数”、“哈密顿路径计数”等,常见于 n,m ≤ 12 的网格。
斜率优化 优化转移方程形如 dp[i] = min(dp[j] + (sum[i]-sum[j])² + C) 的 DP,将 O(n²) 降为 O(n),经典题如“玩具装箱”、“土地购买”。
四边形不等式优化 当 cost(l,r) 满足四边形不等式时,优化区间 DP 的决策点,将 O(n³) 降为 O(n²),如“石子合并”的优化版本。
WQS 二分(带权二分) 解决“恰好选 K 个”的 DP 最优化问题。通过二分附加惩罚项,将限制转化为无限制 DP,经典题如“Aliens trick”、“邮局问题”的变体。
CDQ 分治优化 DP 将 DP 的转移视为偏序关系,用 CDQ 分治处理左半部分对右半部分的贡献,常用于三维偏序下的 DP 优化。

图论

图论基础

算法 在题目中的具体用途
拓扑排序 DAG 上的 DP(如最长路、方案数);判断图中是否有环任务调度(课程表问题);依赖关系处理(如编译顺序)。
欧拉回路/路径 一笔画问题:判断能否不重复地经过所有边,并输出路径(如“单词接龙”中拼接欧拉路径)。
哈密尔顿回路/路径 NP 完全问题,仅在 n ≤ 20 时用状压 DP 求是否存在经过每个点恰好一次的路径(TSP 的变体)。
2-SAT 求解布尔变量之间的成对约束(如“A 为真或 B 为假”),典型题如“Peaceful Commission”(和平委员会)、雷达站布局问题。

最短路

算法 在题目中的具体用途
Dijkstra(堆优化) 非负权单源最短路,适用于稀疏图(O(m log n)),如“最短路计数”、“最短路径输出”。
SPFA 处理含负权边的单源最短路;判断负环(如“虫洞”问题)。注意在 OI 中常被卡,建议谨慎使用。
Bellman-Ford 功能同 SPFA,但复杂度高(O(nm)),通常只用于理论证明或极小的图。
Floyd-Warshall 多源最短路(n ≤ 400);传递闭包(判断两点是否可达);最小环(求图中最小权值的环)。
差分约束 将形如 x_i - x_j ≤ c 的不等式组转化为最短路问题,求解一组可行解,典型如“糖果”问题(求最小值)。
K 短路 求从 s 到 t 的第 K 短路径,常用 A* 算法(估价函数为当前点到终点的最短路)或 Yen 算法

生成树

算法 在题目中的具体用途
Kruskal 最小生成树(MST),适用于稀疏图;次小生成树(枚举非树边替换树边)。
Prim 最小生成树(MST),适用于稠密图(O(n²) 或 O(m log n))。
Kruskal 重构树 构建“最小瓶颈路”的树形结构,解决树上两点路径中最大边权最小值的问题;也用于处理动态连通性下的查询。
Matrix-Tree 定理 计算生成树个数,用于无向图或有向图的生成树计数问题。
斯坦纳树 在图中连接指定点集(关键点)的最小树,通常用状压 DP 解决,典型应用如“最小费用连接若干城市”。
朱刘算法 求解有向图的最小树形图(以某点为根,能到达所有点的最小总边权)。

连通性

算法 在题目中的具体用途
Tarjan(求 SCC) 将有向图缩点为 DAG,用于后续 DP、拓扑排序;解决 2-SAT 问题;判断强连通关系。
Tarjan(求割点) 识别网络中删除后会使连通分量增多的关键节点,如“服务器故障”问题。
Tarjan(求桥) 识别删除后会使连通分量增多的关键边,如“网络连接可靠性”分析。
Tarjan(求点双/边双连通分量) 用于缩成点双连通分量树边双连通分量树,处理仙人掌图问题或路径必经点/边查询。
圆方树 将一般图(或仙人掌图)转化为树,将图上的最短路DP连通性问题转化为树上问题。

二分图

算法 在题目中的具体用途
二分图判定(染色法) 判断一个图是否为二分图,如“关押罪犯”问题中二分答案后用染色法验证。
匈牙利算法 求解二分图最大匹配(无权),典型题如“假期的宿舍”、“机器任务分配”、“棋盘放置(车、马)”。
KM 算法 求解二分图带权最大匹配(完美匹配),如“运动员最佳匹配”、“任务与工人”的最优分配。

网络流

算法 在题目中的具体用途
Dinic / ISAP 最大流:求解“圆桌问题”(单位代表不能同桌)、“教辅的组成”(书-练习册-答案三级匹配)、“最大闭合权图”(选项目必须选前置项目)、“二分图最大匹配”(比匈牙利更高效)。
费用流(SSP / Primal-Dual) 最小费用最大流:带权匹配、运输问题、任务调度(成本最小化)。
带上下界网络流 处理边的流量有 上下限 的问题,如“有源汇可行流”、“最小费用可行流”,用于“网络扩容”等实际问题。

树相关

算法 在题目中的具体用途
LCA(倍增/Tarjan/树剖) 求树上两点的最近公共祖先;支持路径距离查询(dist = depth[u]+depth[v]-2depth[lca]);路径上点权/边权修改与查询*(配合树链剖分)。
树链剖分(重链剖分) 路径操作:将路径拆成 O(log n) 个区间,用线段树维护,支持路径加、路径求和、路径最大值;子树操作:利用 DFS 序转为区间;求 LCA
长链剖分 优化与深度相关的 DP,如“树上 k 级祖先”的 O(1) 查询,或“树上深度相关统计”的 O(n) 合并。
点分治 统计树上所有路径的信息,如“路径长度为 K 的路径条数”、“路径上点权异或和为 0 的路径数”、“距离小于等于 K 的点对数”。
虚树 多次询问,每次只涉及树上少数关键点,构建只含关键点及其 LCA 的压缩树,优化树形 DP,如“战争”、“消耗战”问题。
DSU on Tree(树上启发式合并) 离线统计子树内信息(如子树颜色种数、众数),将 O(n²) 优化到 O(n log n),典型题“树上数颜色”。
动态树(LCT) 维护动态森林:支持加边、删边、连通性查询、路径异或和、路径最值等操作,用于“动态 MST”、“树上路径修改与查询”。

其他

算法 在题目中的具体用途
MCS(最大势算法) 用于弦图的完美消除序列(PEO)求解;进而求弦图的最大团最小色数最大独立集等。
仙人掌图判定与处理 判断每条边是否至多属于一个简单环,然后利用圆方树将仙人掌转化为树,处理最短路、DP 等问题。

字符串

算法 在题目中的具体用途
KMP 单模式串匹配(判断 s 是否在 t 中出现);利用 PMT 求循环节(如“Period”问题);求最短周期
扩展 KMP(Z 算法) 求原串的每个后缀与模式串的 LCP(最长公共前缀);用于字符串匹配、重复子串检测
Trie(字典树) 字符串前缀查询(如自动补全);异或最大对(将数字二进制插入 Trie,贪心查找);AC 自动机的前置结构。
AC 自动机 多模式串匹配:给定文本串,输出所有模式串出现的位置和次数;在 Trie 上做 DP(如“病毒”问题,找不含某些模式串的字符串)。
后缀数组(SA) 不同子串个数;结合 height 数组求任意两后缀的 LCP最长重复子串模式串出现次数(二分查找区间)。
后缀自动机(SAM) 子串出现次数统计;本质不同子串个数最长公共子串(多串);字典序第 K 大子串子串是否存在
Manacher 最长回文子串回文子串总数统计。
回文自动机(PAM) 统计本质不同回文子串个数及其出现次数;支持在末尾添加字符后动态维护回文信息。
字符串哈希(双哈希) 快速比较任意两个子串是否相等(O(1));配合二分求 LCP;用于模式串匹配去重,需注意防卡哈希。

数学

数论

算法 在题目中的具体用途
欧几里得 / 扩展欧几里得 gcd;解 ax + by = c 的整数解;求模质数下的逆元
素数筛(埃氏/欧拉线性筛) 预处理素数表、最小质因子(用于快速质因数分解)、欧拉函数 φ(n)莫比乌斯函数 μ(n)
快速幂 / 矩阵快速幂 计算大数幂取模(如 a^b mod p);线性递推加速(如斐波那契数列的第 n 项,用矩阵快速幂 O(log n))。
Miller-Rabin 大素数判断(概率性),常用于 Pollard-Rho 的前置步骤。
Pollard-Rho 大整数因数分解,用于 n ≤ 1e18 的情况。
BSGS / exBSGS 求解离散对数:a^x ≡ b (mod p) 的最小非负整数 x。
中国剩余定理(CRT) / exCRT 求解同余方程组:x ≡ a_i (mod m_i),模数互质用 CRT,不互质用 exCRT。

组合数学

算法 在题目中的具体用途
组合数预处理(阶乘+逆元) 处理多次查询 C(n,k) mod p(p 为大质数),O(1) 回答。
Lucas / exLucas 求 C(n,k) mod p,其中 p 为小质数(Lucas),或 p 为任意数(exLucas)。
容斥原理 计算多个集合并集大小,如“错排问题”、“多个约束条件的计数”。
莫比乌斯反演 处理数论函数与卷积,经典题如“求 gcd=1 的数对个数”、“约数个数和”。
Polya 定理 等价类计数(如旋转/翻转下不重复的染色方案数)。
卡特兰数 / 斯特林数 卡特兰数:括号匹配、出栈序列、二叉数形态数;斯特林数:集合划分、排列统计。

线性代数

算法 在题目中的具体用途
高斯消元 线性方程组(实数或模意义);求矩阵的秩;解异或方程组(如“开关灯”问题)。
线性基 维护一组数的异或空间,求最大值、最小值、第 K 小;判断某数能否被异或表示;典型题“XOR 最大”、“异或第 K 大”。

多项式

算法 在题目中的具体用途
FFT / NTT 加速多项式乘法,用于大整数乘法、卷积型 DP 优化、生成函数计算。
FWT 加速位运算卷积(AND / OR / XOR 卷积),用于集合幂级数相关 DP。
多项式求逆/ln/exp 用于生成函数的更高级运算,如求 组合数幂级数生成函数封闭形式

博弈论

算法 在题目中的具体用途
Nim 游戏 经典公平组合游戏:判断胜负(异或和是否为 0),求必胜方案。
SG 函数 将任意公平组合游戏转化为 Nim 和:对每个状态求 mex{后继的 SG},异或判断胜负,用于“取石子变体”、“棋盘棋子移动”。
威佐夫博弈 / 斐波那契博弈 特定规则的双人博弈,直接套用公式判定(如威佐夫:判断 (a,b) 是否满足奇异局势)。
树上删边游戏 树上的删边博弈,通过 SG 定理 + 树的“ Green Hackenbush ” 转化为异或问题。
图博弈 有向图上移动棋子的公平博弈,用 DFS 记忆化搜索求每个点的 SG 值,或直接判定胜负态(如“图上取石子”)。
对抗搜索(Alpha-Beta 剪枝) 用于双人完全信息博弈的搜索,如国际象棋、五子棋的 AI 决策(OI 中较少考)。

数据结构

数据结构 在题目中的具体用途
并查集 动态连通性:维护集合合并与查询;Kruskal 的前置;带撤销并查集用于离线分治。
带权并查集 维护集合内元素间的距离/差值关系,如“食物链”(种类关系)、“奇偶游戏”(前缀异或关系)。
树状数组 单点修改 + 区间查询(如求逆序对);区间修改 + 单点查询(差分实现);二维树状数组
线段树 区间修改 + 区间查询(求和、最值、gcd);扫描线求矩形面积并;动态开点线段树线段树合并
主席树(可持久化线段树) 静态区间第 K 大动态区间第 K 大(配合树状数组);历史版本查询树上路径第 K 大(配合树链剖分/主席树前缀和)。
平衡树(Treap / Splay) 动态有序序列:插入、删除、前驱后继、排名查询;区间翻转(Splay);文艺平衡树
左偏树 / 配对堆 可并堆:支持合并两个堆,用于堆优化 Dijkstra 的变体或“猴子打架”问题。
分块 根号暴力优化:维护区间修改/查询,复杂度 O(√n),常用于替代复杂数据结构,如“数列分块入门”系列。
莫队算法 离线区间查询:已知 [l,r] 的答案可 O(1) 扩展到相邻区间,处理大量区间询问(如区间众数、区间不同数个数)。带修莫队支持单点更新;树上莫队处理树上路径查询。
KD-Tree 多维空间最近邻/最远点对搜索,也可用于高维偏序查询。

其他重要思想与技巧

思想/技巧 在题目中的具体用途
贪心 局部最优即全局最优:区间调度(选择最多不相交区间)、哈夫曼编码删数问题
二分答案 答案具有单调性时,将最优化问题转化为判定性问题,如“最大值最小化”(最小化最大边权)、“最小值最大化”(最大化最小间距)。
三分 单峰函数的极值,如“凸函数最值”、“曲线凸性优化”。
CDQ 分治 偏序问题(如三维偏序计数、逆序对变体);DP 优化(用左半更新右半)。
整体二分 同时处理多个具有单调性的询问(如区间第 K 大),将二分答案和数据结构合并处理。
扫描线 处理矩形面积并/周长并区间覆盖事件(如给每个区间赋权,求总覆盖长度)。
模拟退火 / 爬山 求解最优化问题的近似解(如计算几何中的最小覆盖圆),OI 中仅作为骗分或最后手段。
分数规划 求解形如最大化 Σ(a_i) / Σ(b_i) 的问题,如“最优比率生成树”、“最优比率环”(结合二分 + 最短路/生成树)。

这个表格覆盖了从基础排序到冷门算法(MCS、WQS、插头 DP、图博弈等)的全部内容,并对每个算法都给出了它在具体题目中的典型用途。如有遗漏或需要进一步补充的,随时告诉我。