并查集

145 阅读1分钟

并查集

初始化

List<Integer> father = new ArrayList<>();
for (int i = 0; i < n; i++) {
   father.add(i);
}

查找

int find(int n) {
  /*    
  		//非递归写法
        while(father.get(n) != n) {
            n = father.get(n);
        }
        return n;
  */

  //递归, 路径压缩
  if (father.get(n) == n) {
    return n;
  }
  father.set(n, find(father.get(n)));
  return find(father.get(n));
}

合并

void union(int a, int b) {
   int faA = find(a);
   int faB = find(b);
   if (faA != faB) {
      father.set(faA, faB);
   }
}