14 #ifndef OR_TOOLS_ALGORITHMS_DYNAMIC_PERMUTATION_H_ 15 #define OR_TOOLS_ALGORITHMS_DYNAMIC_PERMUTATION_H_ 21 #include "ortools/base/logging.h" 25 class SparsePermutation;
33 class DynamicPermutation {
36 explicit DynamicPermutation(
int n);
38 int Size()
const {
return image_.size(); }
47 void AddMappings(
const std::vector<int>& src,
const std::vector<int>& dst);
57 void UndoLastMappings(std::vector<int>* undone_mapping_src);
64 int ImageOf(
int i)
const;
67 const std::vector<int>& AllMappingsSrc()
const {
return mapping_src_stack_; }
77 int RootOf(
int i)
const;
83 const std::set<int>& LooseEnds()
const {
return loose_ends_; }
89 std::unique_ptr<SparsePermutation> CreateSparsePermutation()
const;
91 std::string DebugString()
const;
94 std::vector<int> image_;
97 std::vector<int> ancestor_;
102 std::vector<int> mapping_src_stack_;
103 std::vector<int> mapping_src_size_stack_;
106 std::set<int> loose_ends_;
110 mutable std::vector<bool> tmp_mask_;
114 inline int DynamicPermutation::ImageOf(
int i)
const {
116 DCHECK_LT(i, Size());
121 inline int DynamicPermutation::RootOf(
int i)
const {
123 DCHECK_LT(i, Size());
125 const int j = ancestor_[i];
126 if (j == i)
return i;
133 #endif // OR_TOOLS_ALGORITHMS_DYNAMIC_PERMUTATION_H_