求助:java 倍增算法 subtask 4个样例都过不去
查看原帖
求助:java 倍增算法 subtask 4个样例都过不去
115810
goodluck321楼主2023/5/23 01:17
import java.util.*;
import java.io.*;

public class Main {

    static List<Integer>[] g;
    static int[][] fa;
    static int[] depth;

    public static void main(String[] args) throws Exception {

        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

        in.nextToken();
        int n = (int) in.nval;
        in.nextToken();
        int m = (int) in.nval;
        in.nextToken();
        int root = (int) in.nval;

        g = new List[n + 1];
        fa = new int[n + 1][20];
        depth = new int[n + 1];
        for (int i = 0; i <= n; i++) {
            g[i] = new ArrayList<>();
        }

        for (int i = 1; i < n; i++) {
            in.nextToken();
            int x = (int) in.nval;
            in.nextToken();
            int y = (int) in.nval;
            g[x].add(y);
            g[y].add(x);
        }
        dfs(root, 0);
        while (m-- > 0) {
            in.nextToken();
            int x = (int) in.nval;
            in.nextToken();
            int y = (int) in.nval;
            System.out.println(lca(x, y));
        }
    }

    private static void dfs(int x, int father) {
        depth[x] = depth[father] + 1;
        fa[x][0] = father;
        for (int i = 1; (1 << i) <= depth[x]; i++) {
            fa[x][i] = fa[fa[x][i - 1]][i - 1];
        }
        for (Integer i : g[x]) {
            if (i != father) {
                dfs(i, x);
            }
        }
    }

    private static int lca(int x, int y) {
        if (depth[x] < depth[y]) {
            int t = x;
            x = y;
            y = t;
        }

        // 把 x, y 提到同一深度
        // 2 ^ 19 > 500005
        for (int i = 19; i >= 0; i--) {
            if (depth[x] - (1 << i) >= depth[y]) {
                x = fa[x][i];
            }
        }
        if (x == y) {
            return x;
        }

        // x 和 y 同步往上跳,找到lca
        for (int i = 19; i >= 0; i--) {
            if (fa[x][i] != fa[y][i]) {
                x = fa[x][i];
                y = fa[y][i];
            }
        }
        return fa[x][0];
    }
}

2023/5/23 01:17
加载中...