zoukankan      html  css  js  c++  java
  • 模板

    注意这里不能再传p=-1了,要传p=0进去。附送一个求两点间路径长度的log的算法,假如边带权,则把dep换成根到该点的路径和即可。

    const int MAXN = 100000;
    vector <int> G[MAXN + 5];
    int dep[MAXN + 5], fa[MAXN + 5][20 + 1];
    
    void dfs(int u, int p) {
        dep[u] = dep[p] + 1;
        fa[u][0] = p;
        for (int i = 1; i <= 20; i++)
            fa[u][i] = fa[fa[u][i - 1]][i - 1];
        for(auto &v : G[u]) {
            if(v == p)
                continue;
            dfs(v, u);
        }
    }
    
    int LCA(int x, int y) {
        if (dep[x] < dep[y])
            swap(x, y);
        for (int i = 20; i >= 0; i--)
            if (dep[x] - (1 << i) >= dep[y])
                x = fa[x][i];
        if (x == y)
            return x;
        for (int i = 20; i >= 0; i--)
            if (fa[x][i] != fa[y][i])
                x = fa[x][i], y = fa[y][i];
        return fa[x][0];
    }
    
    int dis(int x, int y) {
        return dep[x] + dep[y] - 2 * dep[LCA(x, y)];
    }
    

    LCA还可以维护(u,v)间路径的最小值,需要区分LCA(u,v)=u或者LCA(u,v)=v(最后的u和v的父亲边不计算),以及LCA(u,v)==其他(最后的u和v的父亲边都要计算)。

  • 相关阅读:
    20140327工作室日志
    20140326学习工作室日志
    标准连接池实现
    JDBC
    监听器
    数据表多对多
    MATLAB 中几个颜色空间的坐标范围
    RabbitMQ(一)
    Web Service之Axis(二)
    Web Service之CXF(四)
  • 原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12316367.html
Copyright © 2011-2022 走看看