c_cpp 联盟查找不相交集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 联盟查找不相交集相关的知识,希望对你有一定的参考价值。

// union find implementation
class UF {
  // vi p : p[i] stores the index of parent item (i.e. the immediate parent of
  //        item i), if p[i] = i, item i is the representative item of a certain
  //        disjoint set.
  // vi r : r[i] is the UPPER BOUND of the height of the tree rooted at i
  vi p, r;

public:
  UF(int n) {
    p.assign(n, 0);
    iota(p.begin(), p.end(), 0);
    r.assign(n, 0);
  }

  int find(int i) { return (p[i] == i) ? i : (p[i] = find(p[i])); }

  bool same(int i, int j) { return find(i) == find(j); }

  void merge(int i, int j) {
    if (!same(i, j)) {
      int x = find(i), y = find(j);
      if (r[x] > r[y]) {
        p[y] = x;
      } else {
        p[x] = y;
        if (r[x] == r[y]) {
          r[y]++;
        }
      }
    }
  }
};

以上是关于c_cpp 联盟查找不相交集的主要内容,如果未能解决你的问题,请参考以下文章

德莱联盟 计算几何 线段相交

Python入门教程第51篇 不相交集

不相交集类

c_cpp GFG如何检查两个给定的线段是否相交

c_cpp 指向c中的联盟

并查集(不相交集)的Union操作