This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub gtnao/algorithm
#include "src/structure/union_find_tree.hpp"
#pragma once #include <bits/stdc++.h> using namespace std; struct UnionFindTree { private: int n; vector<int> parent, rank; public: UnionFindTree(int n) : n(n), parent(n, -1), rank(n, 0) {} int root(int x) { if (parent[x] == -1) { return x; } return parent[x] = root(parent[x]); } void unite(int x, int y) { x = root(x); y = root(y); if (x == y) { return; } if (rank[x] < rank[y]) { swap(x, y); } if (rank[x] == rank[y]) { ++rank[x]; } parent[y] = x; } bool is_same(int x, int y) { return root(x) == root(y); } vector<vector<int>> groups() { vector<vector<int>> ret(n); for (int i = 0; i < n; i++) { ret[root(i)].emplace_back(i); } ret.erase(remove_if(begin(ret), end(ret), [&](const vector<int> &v) { return v.empty(); }), end(ret)); return ret; } };
#line 2 "src/structure/union_find_tree.hpp" #include <bits/stdc++.h> using namespace std; struct UnionFindTree { private: int n; vector<int> parent, rank; public: UnionFindTree(int n) : n(n), parent(n, -1), rank(n, 0) {} int root(int x) { if (parent[x] == -1) { return x; } return parent[x] = root(parent[x]); } void unite(int x, int y) { x = root(x); y = root(y); if (x == y) { return; } if (rank[x] < rank[y]) { swap(x, y); } if (rank[x] == rank[y]) { ++rank[x]; } parent[y] = x; } bool is_same(int x, int y) { return root(x) == root(y); } vector<vector<int>> groups() { vector<vector<int>> ret(n); for (int i = 0; i < n; i++) { ret[root(i)].emplace_back(i); } ret.erase(remove_if(begin(ret), end(ret), [&](const vector<int> &v) { return v.empty(); }), end(ret)); return ret; } };