蓝桥杯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,记录合并操作的次数。

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

猜你喜欢

转载自blog.csdn.net/qq_65032048/article/details/137648582