- Tarjan算法:DFS+并查集求LCA
- RMQ查询区间最大最小值,st(动态规划写法)
- dfs序/dfn序 -> 使用dfn编号构建的dfs序,在dfs序上rmq查询区间最小值得到的就是lca的编号,映射得到的是节点
板子
话不多说,贴代码
这个代码没有具体的建树,只有核心的代码原理和代码实现,建树用python的邻接表最方便,遍历子节点部分参照Python遍历邻接表逻辑理解
-
public class LCA_RMQ { public static void main(String[] args) { } //Tarjan算法:dfs+并查集求lca, /* 1.遍历节点u的所有子节点 * 2.回溯时子节点合并到父节点所在集合, -> 最近公共祖先:维护集合深度最低的节点 * 3.标记已遍历 * 4.查询该节点与v的公共祖先 * dfs(u): * 遍历儿子 * 回溯合并 * * 遍历每个询问,查询已经构建并查集的v与当前节点u的lca(u,v)=v所在集合 * * */ static final int N = 10010; static int[][] que = new int[N][N],edges = new int[N][N]; static boolean[] vis = new boolean[N]; static int[] cnt = new int[N]; static int[] parent = new int[N]; public void init(){ for(int i=0;i<N;i++)parent[i]=i; } public static int find(int x){ if(parent[x]!=x)parent[