diff --git a/example/isomorphism.cpp b/example/isomorphism.cpp index 3ed18a15..bcb63d29 100644 --- a/example/isomorphism.cpp +++ b/example/isomorphism.cpp @@ -8,32 +8,68 @@ #include #include +#include + +/* + Sample output: + isomorphic? 1 + f: 9 10 11 0 1 3 2 4 6 8 7 5 + */ + int main() { using namespace boost; const int n = 12; - adjacency_list g1(n), g2(n); - add_edge(0, 1, g1); add_edge(1, 2, g1); add_edge(0, 2, g1); - add_edge(3, 4, g1); add_edge(4, 5, g1); - add_edge(5, 6, g1); add_edge(6, 3, g1); - add_edge(7, 8, g1); add_edge(8, 9, g1); add_edge(9, 10, g1); - add_edge(10, 11, g1); add_edge(11, 7, g1); - add_edge(9, 10, g2); add_edge(10, 11, g2); add_edge(11, 9, g2); - add_edge(0, 1, g2); add_edge(1, 3, g2); - add_edge(3, 2, g2); add_edge(2, 0, g2); - add_edge(4, 5, g2); add_edge(5, 7, g2); add_edge(7, 8, g2); - add_edge(8, 6, g2); add_edge(6, 4, g2); + typedef adjacency_list > graph_t; + graph_t g1(n), g2(n); - std::vector f(n); + std::vector::vertex_descriptor> v1(n), v2(n); - bool ret = isomorphism(g1, g2, f.begin()); + property_map::type + v1_index_map = get(vertex_index, g1), + v2_index_map = get(vertex_index, g2); + + graph_traits::vertex_iterator i, end; + int id = 0; + for (tie(i, end) = vertices(g1); i != end; ++i, ++id) { + put(v1_index_map, *i, id); + v1[id] = *i; + } + id = 0; + for (tie(i, end) = vertices(g2); i != end; ++i, ++id) { + put(v2_index_map, *i, id); + v2[id] = *i; + } + add_edge(v1[0], v1[1], g1); add_edge(v1[1], v1[2], g1); + add_edge(v1[0], v1[2], g1); + add_edge(v1[3], v1[4], g1); add_edge(v1[4], v1[5], g1); + add_edge(v1[5], v1[6], g1); add_edge(v1[6], v1[3], g1); + add_edge(v1[7], v1[8], g1); add_edge(v1[8], v1[9], g1); + add_edge(v1[9], v1[10], g1); + add_edge(v1[10], v1[11], g1); add_edge(v1[11], v1[7], g1); + + add_edge(v2[9], v2[10], g2); add_edge(v2[10], v2[11], g2); + add_edge(v2[11], v2[9], g2); + add_edge(v2[0], v2[1], g2); add_edge(v2[1], v2[3], g2); + add_edge(v2[3], v2[2], g2); add_edge(v2[2], v2[0], g2); + add_edge(v2[4], v2[5], g2); add_edge(v2[5], v2[7], g2); + add_edge(v2[7], v2[8], g2); + add_edge(v2[8], v2[6], g2); add_edge(v2[6], v2[4], g2); + + std::vector::vertex_descriptor> f(n); + + bool ret = isomorphism(g1, g2, + isomorphism_map(make_iterator_property_map + (f.begin(), v1_index_map))); std::cout << "isomorphic? " << ret << std::endl; std::cout << "f: "; - std::copy(f.begin(), f.end(), std::ostream_iterator(std::cout, " ")); + for (int v = 0; v != f.size(); ++v) + std::cout << get(vertex_index, g2, f[v]) << " "; std::cout << std::endl; return 0;