【发布时间】:2021-04-19 00:40:49
【问题描述】:
以下程序基于boost网站https://www.boost.org/doc/libs/master/libs/graph/example/vf2_sub_graph_iso_multi_example.cpp提供的示例
#include <boost/graph/vf2_sub_graph_iso.hpp>
using namespace boost;
int main() {
typedef property<edge_name_t, char> edge_property;
typedef property<vertex_name_t, char, property<vertex_index_t, int> >
vertex_property;
typedef adjacency_list<vecS, listS, bidirectionalS, vertex_property,
edge_property>
graph_type;
// Build graph1
graph_type graph1;
auto v0 = add_vertex(vertex_property('a'), graph1);
auto v1 = add_vertex(vertex_property('a'), graph1);
auto v2 = add_vertex(vertex_property('a'), graph1);
add_edge(v0, v1, edge_property('b'), graph1);
add_edge(v1, v2, edge_property('b'), graph1);
add_edge(v0, v2, edge_property('d'), graph1);
// Build graph2
graph_type graph2;
auto w0 = add_vertex(vertex_property('a'), graph2);
auto w1 = add_vertex(vertex_property('a'), graph2);
auto w2 = add_vertex(vertex_property('a'), graph2);
add_edge(w0, w1, edge_property('b'), graph2);
add_edge(w1, w2, edge_property('b'), graph2);
add_edge(w0, w2, edge_property('d'), graph2);
// create predicates
typedef property_map<graph_type, vertex_name_t>::type vertex_name_map_t;
typedef property_map_equivalent<vertex_name_map_t, vertex_name_map_t>
vertex_comp_t;
vertex_comp_t vertex_comp = make_property_map_equivalent(
get(vertex_name, graph1), get(vertex_name, graph2));
typedef property_map<graph_type, edge_name_t>::type edge_name_map_t;
typedef property_map_equivalent<edge_name_map_t, edge_name_map_t> edge_comp_t;
edge_comp_t edge_comp = make_property_map_equivalent(get(edge_name, graph1),
get(edge_name, graph2));
// Create callback
vf2_print_callback<graph_type, graph_type> callback(graph1, graph2);
vf2_graph_iso(graph1, graph2, callback, vertex_order_by_mult(graph1),
edges_equivalent(edge_comp).vertices_equivalent(vertex_comp));
return 0;
}
回调函数不打印任何内容。但是,如果我将第 9 行的 listS 更改为 vecS,则代码可以正常工作。我不明白为什么使用 listS 无法通过同构检查。即使我使用 listS 也可以使它工作吗?
【问题讨论】:
标签: c++ boost boost-graph isomorphism