分治
普通分治:通过将区间分成两个区间,来将问题分成两个⼦问题
二分:对答案分治
整体二分&CDQ分治:离线分治算法
点分治:找重心分治
图论
Dijkstra:找最小的dis[x],x一定确定了最短路,只可解决正权(可用堆优化)
Bellman-Ford:枚举并不断进行松弛
SPFA已死 :队列优化的Bellman_Ford,可用于判负环
Floyd:
设F(K,X,Y) 表示X 到Y 的路径中,满⾜路径上的点的标号都不超过K 的最短路径
F
(
K
,
X
,
Y
)
=
M
i
n
(
F
(
K
−
1
,
X
,
Y
)
,
F
(
K
−
1
,
X
,
K
)
+
F
(
K
−
1
,
K
,
Y
)
)
F(K,X,Y)=Min( F(K-1,X,Y) , F(K-1,X,K)+F(K-1,K,Y) )
F(K,X,Y)=Min(F(K−1,X,Y),F(K−1,X,K)+F(K−1,K,Y))
用于求多源最短路
差分约束:给出d[y]<=d[x]+w一类不等式的最优解,可使用最短/长路求解
Tarjan:求强连通分量,可求割点、割边
Kruskal:贪心,求最小生成树
二分图:
判奇环(二分图):染色法
匈牙利算法:二分图最大匹配
最⼩顶点覆盖:选最少的点覆盖所有边
|⼆分图最⼩顶点覆盖|=|⼆分图最⼤匹配|
最⼤独⽴集:选最多的点使得它们两两没边相连
|⼆分图最⼤独⽴集|=总点数-|⼆分图最⼩顶点覆盖|
Hall 引理:
设S 是左边点的⼀个⼦集,设N(S) 为S 所有点邻居的并
集,则⼀个⼆分图存在完美匹配的充要条件是:
对于所有S,
∣
S
∣
<
=
∣
N
(
S
)
∣
|S|<=|N(S)|
∣S∣<=∣N(S)∣
字符串
KMP:用next数组实现快速字符串匹配
AC自动机:在Trie树上跑KMP以实现多模式串匹配
后缀数组SA:
给定⼀个串s[1…n],将所有后缀排序
rk[i]:s[i…n] 的排名
sa[i]: rk 为i 的后缀是哪个
分治还是比较友善的,图论比较基础,字符串讲的实在有点快