cpplib

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

View the Project on GitHub edge2992/cpplib

:heavy_check_mark: test/union_find.aoj.test.cpp

Depends on

Code

#define PROBLEM \
  "https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/all/DSL_1_A"
#include <iostream>

#include "../macros.hpp"
#include "../structure/unionFind.hpp"
using namespace std;

int main() {
  int n, q;
  cin >> n >> q;
  UnionFind uf(n);
  rep(i, q) {
    int com, x, y;
    cin >> com >> x >> y;
    if (com == 0) {
      uf.unite(x, y);
    } else if (com == 1) {
      cout << uf.same(x, y) << endl;
    }
  }
  return 0;
}
#line 1 "test/union_find.aoj.test.cpp"
#define PROBLEM \
  "https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/all/DSL_1_A"
#include <iostream>

#line 2 "macros.hpp"
#define rep(i, n) for (int i = 0; i < (n); i++)
#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;
  }
};
#line 7 "test/union_find.aoj.test.cpp"
using namespace std;

int main() {
  int n, q;
  cin >> n >> q;
  UnionFind uf(n);
  rep(i, q) {
    int com, x, y;
    cin >> com >> x >> y;
    if (com == 0) {
      uf.unite(x, y);
    } else if (com == 1) {
      cout << uf.same(x, y) << endl;
    }
  }
  return 0;
}
Back to top page