并查集算法

代码

class bingCJ {
private:
   int father[MAXN];
public:
   //初始化所有的节点的父节点都是本身
   void init(int n) {
      for(int i = 1; i <= n; i++) {
         father[i] = i;
      }
   }

   //找到i节点的祖先(也就是所在集合的代表人物)
   // int find(int i) {
   //    //如果找到祖先就返回
   //    if(father[i] == i) {
   //       return i;
   //    }else {
   //       return find(father[i]);
   //    }
   // }
   //find的路径压缩版本,本质其实就是在找寻的过程中,把父节点都更新成祖先节点,提高查找效率
   int find(int i) {
      if(father[i] == i) {
         return i;
      }else {
         father[i] = find(father[i]);
         return father[i];
      }
   }

   //合并两个节点所在的集合
   void unionn(int i, int j) {
      //找到他们的祖先
      int i_fa = find(i);
      int j_fa = find(j);
      //将他们的祖先联合在一起
      father[i_fa] = j_fa;
   }

};
posted @ 2023-08-21 18:12  铜锣湾陈昊男  阅读(9)  评论(0)    收藏  举报