提升不相交集

Boost disjoint set

本文关键字:      更新时间:2023-10-16

我需要制作一个类型为dataum的不相交集。

我有向量中的所有数据,如下

vector<dataum> S;
S.push_back( dataum(0,0) );
S.push_back( dataum(0,1) );
S.push_back( dataum(0,2) );
 .
 .

然后我创建dissect_set

std::vector<int>  rank (100);
std::vector<dataum>  parent (100);
boost::disjoint_sets<int*,dataum*> ds(&rank[0], &parent[0]);
for( int i=0 ; i<S.size() ; i++ )
{
    ds.make_set( S[i] );
}

这似乎不起作用。我错过了什么?我想创建一个具有自定义数据类型的不相交集。在这种情况下,dataum。最初,我的每个dataums都应该在不同的集合中。

文档指出

  • Rank必须是具有整数值类型和等于集合元素类型的键类型的ReadWritePropertyMap的模型
  • Parent必须是ReadWritePropertyMap的模型,并且键和值类型与集合的元素类型相同

在你之前的问题中,我在评论中发布了以下示例代码:

在看了(对我来说是新的)disjoint_set_*类之后,我认为它们不能迭代集合的成员。它们的作用类似于从元素到集合代表的单向映射。如果它对您有帮助:http://paste.ubuntu.com/8881626–9小时前

它在这里,为想象中的dataum类型重新设计:

struct dataum { 
    int x,y; 
    bool operator< (const dataum& o) const { return tie(x,y)  < tie(o.x,o.y); } 
    bool operator==(const dataum& o) const { return tie(x,y) == tie(o.x,o.y); } 
    bool operator!=(const dataum& o) const { return tie(x,y) != tie(o.x,o.y); } 
};

以下是我如何看到它的disjoint_set声明:

std::map<dataum,int> rank;
std::map<dataum,dataum> parent;
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));

这方面的机制可以在Boost PropertyMap的文档中找到,它是一个非常强大的通用数据结构抽象层,主要与Boost Graph Library一起使用。它非常强大,但我不能说它对用户友好。

这是完整的演示在Coliru上直播

#include <boost/pending/disjoint_sets.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <iostream>
#include <map>
#include <cassert>
using namespace boost;
struct dataum { 
    int x,y; 
    bool operator< (const dataum& o) const { return tie(x,y)  < tie(o.x,o.y); } 
    bool operator==(const dataum& o) const { return tie(x,y) == tie(o.x,o.y); } 
    bool operator!=(const dataum& o) const { return tie(x,y) != tie(o.x,o.y); } 
};
int main() {
    std::vector<dataum> S { {0,0}, {0,1}, {0,2} };
    std::map<dataum,int> rank;
    std::map<dataum,dataum> parent;
    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));
    for(auto i=0ul; i<S.size(); i++)
        ds.make_set(S[i]);
    assert((ds.count_sets(S.begin(), S.end()) == 3));
    assert((ds.find_set(dataum{0,2}) == dataum{0,2}));
    assert((ds.find_set(dataum{0,1}) == dataum{0,1}));
    ds.union_set(dataum{0,2},dataum{0,1});
    assert((ds.count_sets(S.begin(), S.end()) == 2));
    assert((ds.find_set(dataum{0,2}) == dataum{0,1}));
    assert((ds.find_set(dataum{0,1}) == dataum{0,1}));
    std::cout << "done";
}

1.3.3 Coliru仍未与合作

相关文章:
  • 没有找到相关文章