搜索
蒟蒻一般最喜欢DFS
DFS的应用真的是不要再广了……只要是搜索,蒟蒻一般都优先考虑DFS,尤其是暴力
BFS应用有下三:
1.无边权或边权都相等的图中求最短路
有边权的最短路有一个近似BFS的算法叫SPFA(← 几乎无所不能!)
2. 遍历一个连通分支中的所有点(据说这叫扩散性, 也是很形象了)
3. 染色
E.G.封锁阳光大学 https://www.luogu.org/problemnew/show/P1330
两种搜索都可以记录路径
dfs直接用一个数组即时记录就可以了
bfs可以把父节点回溯
动态规划
背包DP
序列DP
区间DP
区间DP一般是给一些量和一些操作
问按什么样的顺序进行操作才能取到最优值
关路灯 https://www.luogu.org/problemnew/show/P1220
棋盘DP
划分DP
树型DP
用于处理树上问题(白说)
数位DP
期望DP(也叫概率DP)
状压DP
排序
冒泡 | 1 | n ^ 2 | 稳定 | 求最大值 |
插入 | 1 | n ^ 2 | 稳定 | |
归并 | n | n log n | 稳定 | |
快排 | log n ~ n | n log n | 不稳定 | 可以实现区间的排序 |
选择 | 1 | n ^ 2 | 稳定 | |
二叉树 | n | n log n | 不一定 | |
堆 | 1 | n log n | 不稳定 | |
希尔 | 1 | 不稳定 |
(第二列空间复杂度,第三列时间,抱歉少开一行)
其实,大多数时候不得不说STL的sort是最好用的
但是这些排序算法都有很好的思想,而且都有它们独特的用武之地(比如瑞士轮的归并排序)
数据结构
优先队列
并查集
图不连通时,判断有多少个连通的子图 或 判断两点是否连接
很棒的算法ヾ(๑╹◡╹)ノ" 蒟蒻很心水
树状数组(线段树的特殊情况)
区间减法
线段树
区间加法与区间减法
以上二者在模拟的时候可以实现快速查找和快速修改
常与差分(前缀和)一起用
treap
splay
AVL
主席树
树链剖分
树套树
后缀数组
LCT
最短路
SPFA(万能老大哥)ヾ(๑╹◡╹)ノ"
适用于单源最短路,不能判断负环,但有点入队超过n次就是负环
Dijkstra
一般用它的题目会给出点和边的数量,起点和终点,边的信息(不含负边权)
不能用于负边权
可以类比于prim
Bellman-Ford
因为复杂度高基本不用的……
可判负环
Floyd
多数使用邻接矩阵(好像就是遍历了所有点的spfa)多源最短路
二分
二分答案
xx最大时求yy的最小值
xx最小时求xx的最大值
具有单调性 可以转为判定问题
二分查找
实现快速查找 属于基本的基本
很多算法都用它来加速
二分图
最大匹配
最佳匹配
最大团
最大独立集
最小覆盖集
字符串(比较虚)
KMP
AC自动机
Trie(字典树
后缀数组
LCP
BST
其他
高精度
不用说啦就是要处理的值巨大的时候用
STL库 万能 但不要过度依赖
manacher 检测回文