图论
树剖: 速度较快, 能够维护动态信息
倍增: 实现方便,速度较快,易维护静态信息
(Tarjan) 求 (LCA): 离线算法, 时间复杂度 (O(n + q))
最小生成树的 (Boruvka) 算法, 因为最多需要用 (log V) 次即可联通, 拓展比较多, 时间复杂度优秀 (O(E log V))
次小生成树: 每次替换一条在最小生成树中的最大边, 并使原图联通, 可用倍增维护
严格次小生成树: 考虑维护最大边的同时维护严格次大边, 每次替换时, 若用来替换的边的权值和最大边权值相同则替换严格次大边
(Kruskal) 重构树: 在(Kruskal)的过程中建立, 可用来查找最小瓶颈路
斯坦纳树: 本质是 子集DP
, 连通若干个关键点的最小边权和
同余最短路: 类似于 P3403 跳楼机 的转换方式可用矩阵快速幂或最短路实现
子集dp:
(O(3 ^ n))
for (int i = 1; i < (1 << n); i++) {
for (int j = i; j; j = (j - 1) & i) {
/*
j为i的子集
*/
}
}
(O(n imes 2 ^ n))
for (int i = 0; i < n; i++) {
for (int j = 0; j < (1 << n); j++) {
if (j & (1 << i)) {
/*
j ^ (1 << i) 为 j 的子集
*/
}
}
}
(checkmark)