日常题解——LCA和RMQ1

  • 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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值