我正在尝试将 boost:disjoint_sets 用于由以下结构表示的非重叠间隔(在我的情况下,集合中的间隔必须在其成员之间没有交集):
struct dataum {
int x,y;
bool operator< (const dataum& o) const { return y < o.x ; }
bool operator==(const dataum& o) const {
if(x <= o.x && o.x <= y && y <= o.y )
return true;
if(x <= o.x && o.y <= y)
return true;
if(o.x <= x && y <= o.y)
return true;
if(o.x <= x && x <= o.y && o.y <= y )
return true;
return false;
}
bool operator!=(const dataum& o) const {
return !operator==(o);
}
};
假设我有一个区间列表,例如([1,3]、[4,5]、[6,10]、[8,9])。我初始化一个不相交的集合,如下所示:
boost::disjoint_sets<
associative_property_map<std::map<dataum,int>>,
associative_property_map<std::map<dataum,dataum>> > ds(
make_assoc_property_map(rank),
make_assoc_property_map(parent));
然后我在列表的所有元素中执行 make_set,这将导致 4 个不相交的集合,对吗?在此之后,我执行以下操作:
std::cout << ds.count_sets(S.begin(), S.end()) << std::endl;
ds.union_set(S[0],S[1]);
ds.union_set(S[1],S[2]);
std::cout << ds.count_sets(S.begin(), S.end()) << std::endl;
我不明白的是为什么最后一个 cout 说我只有一套,在我的理解中应该说我有 2 套 {[1,3], [4,5], [6,10]} 和{[8,9]}。
谁能帮我理解发生了什么?