算法学习笔记(1) : 并查集 - 知乎

Union by Size (alternate to Union by Rank)

struct DSU {
  vector<int> parent;
  vector<int> sz;
 
  DSU(int n) {
    parent.resize(n + 1);
    sz.resize(n + 1);
    for (int i = 1; i <= n; i++) {
      parent[i] = i;
      sz[i] = 1;
    }
  }
 
  int find(int x) {
    if (parent[x] == x)
      return x;
    return parent[x] = find(parent[x]);
  }
 
  bool unite(int u, int v) {
    int ru = find(u);
    int rv = find(v);
    if (ru == rv)
      return false;
 
    if (sz[ru] < sz[rv]) {
      swap(ru, rv);
    }
    parent[rv] = ru;
    sz[ru] += sz[rv];
    return true;
  }
};

Example 0:

721. Accounts Merge