c++ - boost::graph同构的使用

标签 c++ c++11 boost graph isomorphism

如何指定 boost::isomorphism_map使用 adjacency_list<vecS, vecS, undirectedS> 时?

我要完成的标记为 ????????? :

typedef adjacency_list<vecS, vecS, undirectedS> graph_t;
      graph_t g1(n), g2(n);

      add_edge(0, 1, g1); add_edge(1, 2, g1); 

      add_edge(9, 10, g2);  add_edge(10, 11, g2);  

      std::vector<graph_traits<graph_t>::vertex_descriptor> f(n);

      bool ret = isomorphism
        (g1, g2, isomorphism_map
         (make_iterator_property_map(f.begin(), ?????????, f[0])));

最佳答案

要创建迭代器属性映射,您需要两个参数:

make_iterator_property_map( RAIter iter, ID id )

放弃你的第三个论点。

第一个:f.begin() 是第一个元素的随机访问迭代器。

ID 需要是顶点索引图。在您的情况下,您可以从图中查询它(因为 vecS 导致隐式顶点索引):

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/isomorphism.hpp>
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> graph_t;

int main() {
    int n = 12;
    graph_t g1(n), g2(n);

    add_edge(0, 1, g1);
    add_edge(1, 2, g1);

    add_edge(9, 10, g2);
    add_edge(10, 11, g2);

    std::vector<graph_t::vertex_descriptor> f(n);

    bool ret = isomorphism(
            g1, g2,
            isomorphism_map(boost::make_iterator_property_map(f.begin(), boost::get(boost::vertex_index, g1)))
        );
}

注意事项

考虑制作一个安全的迭代器映射:

boost::make_safe_iterator_property_map(f.begin(), n, boost::get(boost::vertex_index, g1))

如果你对安全不感兴趣(?!??)你可以做的更短:

bool ret = isomorphism(g1, g2, boost::isomorphism_map(f.data()));

这会自动使用 vertex_index

关于c++ - boost::graph同构的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243999/

相关文章:

c++ - 透视 View openGL qt的任何解决方案

c++ - 创建一个程序来输出 4 个三角平方数

c++ - 循环 std::unordered_map,序列总是我插入元素的序列?

C++11:通用执行器

c++ - boost::date_time::days_until_weekday 的编译错误

c++ - 检测 boost 测试用例是否失败

c++ - 如何将多个文件描述符合并为一个?

C++::如何使用 sqlite3 insertquery 连接变量

c++ - c++ 有等效的 boost::numeric_cast<DestType>(SourceType) 吗?

c++ - 抛出 'std::logic_error' What() 的实例后调用终止: basic_string::_S_construct null 无效