ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

$\text{All LCA}$

2022-07-23 11:31:27  阅读:120  来源: 互联网

标签:Fa int text scanf son dep Link LCA


  • \(1.Multiplication\)
  • \(2.Treediv\)
  • \(3.Euler+ST\)
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;

int n, m, S;
vector <int> Link[N];

namespace solve1 {
    int f[N][25], dep[N];
    void dfs(int u, int Fa) {
        dep[u] = dep[Fa] + 1;
        f[u][0] = Fa;
        for(auto v : Link[u]) {
            if(v != Fa) dfs(v, u);
        }
    }

    inline void init() {
        for(int j = 1; j <= 22; ++j)
            for(int i = 1; i <= n; ++i) 
                f[i][j] = f[f[i][j - 1]][j - 1];
    }

    inline int Lca(int x, int y) {
        if(dep[x] < dep[y]) swap(x, y);
        for(int i = 22; ~i; --i) if(dep[f[x][i]] >= dep[y]) x = f[x][i];
        if(x == y) return x;
        for(int i = 22; ~i; --i) if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
        return f[x][0];
    }

    inline void work() {
        scanf("%d %d %d", &n, &m, &S);
        for(int i = 1, x, y; i < n; ++i) {
            scanf("%d %d", &x, &y);
            Link[x].push_back(y);
            Link[y].push_back(x);
        }
        dfs(S, 0);
        init();
        while(m--) {
            static int x, y; scanf("%d %d", &x, &y);
            printf("%d\n", Lca(x, y));
        }
    }
} // 38 lines, P3379 3.7s

namespace solve2 {
    int dep[N], fa[N], sz[N], son[N], top[N];

    void dfs1(int u, int Fa) {
        dep[u] = dep[Fa] + 1;
        fa[u] = Fa;
        sz[u] = 1;
        for(auto v : Link[u]) {
            if(v == Fa) continue;
            dfs1(v, u);
            sz[u] += sz[v];
            if(sz[son[u]] < sz[v]) son[u] = v;
        }
    }

    void dfs2(int u, int tp) {
        top[u] = tp;
        if(!son[u]) return;
        dfs2(son[u], tp);
        for(auto v : Link[u]) if(v != fa[u] && v != son[u]) dfs2(v, v);
    }

    inline int Lca(int x, int y) {
        while(top[x] != top[y]) {
            if(dep[top[x]] <= dep[top[y]]) swap(x, y);
            x = fa[top[x]];
        }
        return dep[x] < dep[y] ? x : y;
    }

    inline void work() {
        scanf("%d %d %d", &n, &m, &S);
        for(int i = 1, x, y; i < n; ++i) {
            scanf("%d %d", &x, &y);
            Link[x].push_back(y);
            Link[y].push_back(x);
        }
        dfs1(S, 0);
        dfs2(S, 0);
        while(m--) {
            static int x, y; scanf("%d %d", &x, &y);
            printf("%d\n", Lca(x, y));
        }
    }
} // 44 lines, P3379 2.13s

namespace solve3 {
    int f[N][27], cnt, mp[N], dep[N];
    void dfs(int u, int Fa) {
        dep[u] = dep[Fa] + 1; mp[u] = cnt + 1; f[++cnt][0] = u;
        for(auto v : Link[u]) {
            if(v == Fa) continue;
            dfs(v, u);
            f[++cnt][0] = u;
        }
    }

    inline void ST() {
        for(int j = 1; j <= 24; ++j)
            for(int i = 1; i + (1 << j) - 1 <= cnt; ++i)  
                f[i][j] = dep[f[i][j - 1]] < dep[f[i + (1 << (j - 1))][j - 1]] ? 
                    f[i][j - 1] : f[i + (1 << (j - 1))][j - 1];
    }

    inline int query(int x, int y) {
        int k = log2(y - x + 1);
        return dep[f[x][k]] <= dep[f[y - (1 << k) + 1][k]] ? f[x][k] : f[y - (1 << k) + 1][k];
    }

    inline int Lca(int x, int y) {
        int l = mp[x], r = mp[y];
        if(l > r) swap(l, r);
        return query(l, r);
    }

    inline void work() {
        scanf("%d %d %d", &n, &m, &S);
        for(int i = 1, x, y; i < n; ++i) {
            scanf("%d %d", &x, &y);
            Link[x].push_back(y);
            Link[y].push_back(x);
        }
        dfs(S, 0);
        ST();
        while(m--) {
            static int x, y; scanf("%d %d", &x, &y);
            printf("%d\n", Lca(x, y));
        }
    }
} // 43 lines P3379 3.18s

using namespace solve3;

signed main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("Ans.txt", "w", stdout);
#endif
    work();
}

标签:Fa,int,text,scanf,son,dep,Link,LCA
来源: https://www.cnblogs.com/Doge297778/p/16511228.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有