zoukankan      html  css  js  c++  java
  • LCA板子

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct zzz {
        int t, nex;
    }e[500010 << 1]; int head[500010], tot;
    void add(int x, int y) {
        e[++tot].t = y;
        e[tot].nex = head[x];
        head[x] = tot;
    }
    int depth[500001], fa[500001][22], lg[500001];
    void dfs(int now, int fath) {
        fa[now][0] = fath; depth[now] = depth[fath] + 1;
        for(int i = 1; i <= lg[depth[now]]; ++i)
            fa[now][i] = fa[fa[now][i-1]][i-1];
        for(int i = head[now]; i; i = e[i].nex)
            if(e[i].t != fath) dfs(e[i].t, now);
    }
    int LCA(int x, int y) {
        if(depth[x] < depth[y]) swap(x, y);
        while(depth[x] > depth[y])
            x = fa[x][lg[depth[x]-depth[y]] - 1];
        if(x == y) return x;
        for(int k = lg[depth[x]] - 1; k >= 0; --k)
            if(fa[x][k] != fa[y][k])
                x = fa[x][k], y = fa[y][k];
        return fa[x][0];
    }
    int main() {
        int n, m, s; scanf("%d%d%d", &n, &m, &s);
        for(int i = 1; i <= n-1; ++i) {
            int x, y; scanf("%d%d", &x, &y);
            add(x, y); add(y, x);
        }
        for(int i = 1; i <= n; ++i)
            lg[i] = lg[i-1] + (1 << lg[i-1] == i);
        dfs(s, 0);
        for(int i = 1; i <= m; ++i) {
            int x, y; scanf("%d%d",&x, &y);
            printf("%d
    ", LCA(x, y));
        }
        return 0;
    }
  • 相关阅读:
    hdu1003 最大连续子序和
    ACM 线性规划
    ACM 概率&&动态规划
    ACM 数论 质因数分解
    ACM 计数
    ACM 概率
    ACM矩形嵌套问题LIS
    ACM 编辑距离
    ACM线性方程
    ACM 错排
  • 原文地址:https://www.cnblogs.com/lcsdsg/p/14372725.html
Copyright © 2011-2022 走看看