cpplib

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub edge2992/cpplib

:heavy_check_mark: Union Find
(structure/unionFind.hpp)

UnionFind

実装ヒント

Required by

Verified with

Code

#pragma once
#include <algorithm>
#include <vector>

struct UnionFind {
  std::vector<int> data;
  UnionFind() = default;

  explicit UnionFind(size_t sz) : data(sz, -1) {}

  bool unite(int a, int b) {
    a = find(a);
    b = find(b);
    if (a == b) return false;
    if (data[a] < data[b]) std::swap(a, b);
    data[a] += data[b];
    data[b] = a;
    return true;
  }

  int find(int a) {
    if (data[a] < 0) return a;
    return data[a] = find(data[a]);
  }

  int same(int a, int b) { return find(a) == find(b); }

  int size(int k) { return -data[find(k)]; }

  std::vector<std::vector<int>> groups() {
    int n = (int)data.size();
    std::vector<std::vector<int>> ret(n);
    for (int i = 0; i < n; i++) {
      ret[find(i)].emplace_back(i);
    }
    ret.erase(std::remove_if(std::begin(ret), std::end(ret),
                        [&](const std::vector<int>& v) { return v.empty(); }),
              std::end(ret));
    return ret;
  }
};
#line 2 "structure/unionFind.hpp"
#include <algorithm>
#include <vector>

struct UnionFind {
  std::vector<int> data;
  UnionFind() = default;

  explicit UnionFind(size_t sz) : data(sz, -1) {}

  bool unite(int a, int b) {
    a = find(a);
    b = find(b);
    if (a == b) return false;
    if (data[a] < data[b]) std::swap(a, b);
    data[a] += data[b];
    data[b] = a;
    return true;
  }

  int find(int a) {
    if (data[a] < 0) return a;
    return data[a] = find(data[a]);
  }

  int same(int a, int b) { return find(a) == find(b); }

  int size(int k) { return -data[find(k)]; }

  std::vector<std::vector<int>> groups() {
    int n = (int)data.size();
    std::vector<std::vector<int>> ret(n);
    for (int i = 0; i < n; i++) {
      ret[find(i)].emplace_back(i);
    }
    ret.erase(std::remove_if(std::begin(ret), std::end(ret),
                        [&](const std::vector<int>& v) { return v.empty(); }),
              std::end(ret));
    return ret;
  }
};
Back to top page