28 if (num_nodes == old_num_nodes) {
31 CHECK_GE(num_nodes, 0) <<
"Number of nodes overflowed the `int` type.";
32 CHECK_GT(num_nodes, old_num_nodes);
35 parent_.resize(num_nodes);
36 std::iota(parent_.begin() + old_num_nodes, parent_.end(), old_num_nodes);
38 component_size_.resize(num_nodes, 1);
40 rank_.resize(num_nodes);
42 num_components_ += num_nodes - old_num_nodes;
66 if (num_nodes != num_nodes_at_last_get_roots_call_) {
70 const int previous_num_roots = roots_.size();
71 roots_.resize(previous_num_roots + num_nodes -
72 num_nodes_at_last_get_roots_call_);
73 std::iota(roots_.begin() + previous_num_roots, roots_.end(),
74 num_nodes_at_last_get_roots_call_);
81 &roots_, [&](
const int node) {
return node !=
FindRoot(node); });
83 num_nodes_at_last_get_roots_call_ = num_nodes;
89 const int min_num_nodes = std::max(node1, node2) + 1;
103 DCHECK_GE(num_components_, 2);
106 const int component_size = component_size_[root1] + component_size_[root2];
111 if (rank_[root1] > rank_[root2]) {
112 parent_[root2] = root1;
113 component_size_[root1] = component_size;
115 parent_[root1] = root2;
116 component_size_[root2] = component_size;
118 if (rank_[root1] == rank_[root2]) {