蓝桥杯JAVA组备赛模板3:并查集模板

并查集模板:

//并查集模板
    static int id[]=new int [1000010];    
    //创建祖先数组,并将每个元素的祖先设置为自己
    static void creat(){
        for(int i=0;i<id.length;i++){
            id[i]=i;
        }
    }
    static int count=0;
    //查寻各自的祖先
    static int find(int i){
        if (id[i]==i){
            return i;
        }
        id[i]=find(id[i]);//???
        return id[i];
    }
    //集(合并操作)
   static void union(int i,int j){
        int a=find(i);
        int b=find(j);
        if (a!=b){//避免重复和并
            id[a]=b;
            count++;//合并次数
        }

    }

并查集的模板实现,用于解决集合的合并与查找问题。以下是代码的详细解释:

  • id[]: 这是一个数组,用于存储每个元素的祖先(也可以理解为代表元素),数组的索引表示元素的编号,数组的值表示该元素的祖先的编号。
  • creat(): 这个方法用于初始化并查集,将每个元素的祖先设置为自己,即 id[i] = i
  • find(int i): 这个方法用于查找元素 i 的祖先。如果 id[i] == i,表示 i 自己就是祖先,直接返回 i;否则,递归地查找 id[i] 的祖先,并将 i 的祖先设置为查找结果,这是为了路径压缩,优化后续的查找操作。
  • union(int i, int j): 这个方法用于合并两个集合。首先找到 ij 的祖先 ab,如果 a != b,说明它们属于不同的集合,将其中一个集合的祖先指向另一个集合的祖先,这样就完成了合并操作。同时,维护一个计数器 count,记录合并操作的次数。

并查集通常用于解决元素之间的连通性问题,比如在图论中判断两个节点是否在同一个连通分量中,或者在最小生成树算法中判断是否形成环等。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值