总结反思
图论
树剖: 速度较快, 能够维护动态信息
倍增: 实现方便,速度较快,易维护静态信息
\(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 \times 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\)