总结反思

图论

树剖: 速度较快, 能够维护动态信息

倍增: 实现方便,速度较快,易维护静态信息

\(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\)

posted @ 2020-10-17 22:10  Eqvpkbz  阅读(60)  评论(0编辑  收藏  举报