18 #include "absl/strings/str_join.h"
27 std::vector<bool> should_be_deleted(
NumCycles(),
false);
28 for (
int i : cycle_indices) {
31 DCHECK(!should_be_deleted[i])
32 <<
"Duplicate index given to RemoveCycles(): " << i;
33 should_be_deleted[i] =
true;
35 int new_cycles_size = 0;
36 int new_cycle_ends_size = 0;
39 const int end = cycle_ends_[i];
40 if (!should_be_deleted[i]) {
41 for (
int j = start; j < end; ++j) {
42 cycles_[new_cycles_size++] = cycles_[j];
44 cycle_ends_[new_cycle_ends_size++] = new_cycles_size;
48 cycles_.resize(new_cycles_size);
49 cycle_ends_.resize(new_cycle_ends_size);
53 DCHECK_EQ(cycles_.empty(), cycle_ends_.empty());
54 if (!cycles_.empty())
DCHECK_EQ(cycles_.size(), cycle_ends_.back());
55 std::vector<std::vector<int>> cycles;
57 for (
const int end : cycle_ends_) {
60 for (
int i = start + 1; i < end; ++i) {
61 if (cycles_[i] < cycles_[min_pos]) min_pos = i;
63 std::vector<int> cycle;
64 for (
int i = min_pos; i < end; ++i) cycle.push_back(cycles_[i]);
65 for (
int i = start; i < min_pos; ++i) cycle.push_back(cycles_[i]);
66 cycles.push_back(cycle);
69 std::sort(cycles.begin(), cycles.end());
71 for (
const std::vector<int>& cycle : cycles) {
72 if (!out.empty()) out +=
" ";
74 out += absl::StrJoin(cycle,
" ");