36 if (num_nodes == old_num_nodes) {
39 CHECK_GT(num_nodes, old_num_nodes);
42 parent_.resize(num_nodes);
43 std::iota(parent_.begin() + old_num_nodes, parent_.end(), old_num_nodes);
45 component_size_.resize(num_nodes, 1);
47 rank_.resize(num_nodes);
49 num_components_ += num_nodes - old_num_nodes;
57 int root = parent_[node];
58 while (parent_[root] != root) {
63 while (node != root) {
64 const int prev_parent = parent_[node];
73 const int min_num_nodes =
std::max(node1, node2) + 1;
87 DCHECK_GE(num_components_, 2);
90 const int component_size = component_size_[root1] + component_size_[root2];
95 if (rank_[root1] > rank_[root2]) {
96 parent_[root2] = root1;
97 component_size_[root1] = component_size;
99 parent_[root1] = root2;
100 component_size_[root2] = component_size;
102 if (rank_[root1] == rank_[root2]) {
120 return component_size_[
FindRoot(node)];
125 int current_component = 0;
127 int& root_component = component_ids[
FindRoot(node)];
128 if (root_component < 0) {
130 root_component = current_component;
133 component_ids[node] = root_component;
135 return component_ids;