isomorphism.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // (C) Copyright Jeremy Siek 2001.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/config.hpp>
  6. #include <iostream>
  7. #include <boost/graph/isomorphism.hpp>
  8. #include <boost/graph/adjacency_list.hpp>
  9. #include <boost/graph/graph_utility.hpp>
  10. /*
  11. Sample output:
  12. isomorphic? 1
  13. f: 9 10 11 0 1 3 2 4 6 8 7 5
  14. */
  15. int
  16. main()
  17. {
  18. using namespace boost;
  19. const int n = 12;
  20. typedef adjacency_list<vecS, listS, undirectedS,
  21. property<vertex_index_t, int> > graph_t;
  22. graph_t g1(n), g2(n);
  23. std::vector<graph_traits<graph_t>::vertex_descriptor> v1(n), v2(n);
  24. property_map<graph_t, vertex_index_t>::type
  25. v1_index_map = get(vertex_index, g1),
  26. v2_index_map = get(vertex_index, g2);
  27. graph_traits<graph_t>::vertex_iterator i, end;
  28. int id = 0;
  29. for (boost::tie(i, end) = vertices(g1); i != end; ++i, ++id) {
  30. put(v1_index_map, *i, id);
  31. v1[id] = *i;
  32. }
  33. id = 0;
  34. for (boost::tie(i, end) = vertices(g2); i != end; ++i, ++id) {
  35. put(v2_index_map, *i, id);
  36. v2[id] = *i;
  37. }
  38. add_edge(v1[0], v1[1], g1); add_edge(v1[1], v1[2], g1);
  39. add_edge(v1[0], v1[2], g1);
  40. add_edge(v1[3], v1[4], g1); add_edge(v1[4], v1[5], g1);
  41. add_edge(v1[5], v1[6], g1); add_edge(v1[6], v1[3], g1);
  42. add_edge(v1[7], v1[8], g1); add_edge(v1[8], v1[9], g1);
  43. add_edge(v1[9], v1[10], g1);
  44. add_edge(v1[10], v1[11], g1); add_edge(v1[11], v1[7], g1);
  45. add_edge(v2[9], v2[10], g2); add_edge(v2[10], v2[11], g2);
  46. add_edge(v2[11], v2[9], g2);
  47. add_edge(v2[0], v2[1], g2); add_edge(v2[1], v2[3], g2);
  48. add_edge(v2[3], v2[2], g2); add_edge(v2[2], v2[0], g2);
  49. add_edge(v2[4], v2[5], g2); add_edge(v2[5], v2[7], g2);
  50. add_edge(v2[7], v2[8], g2);
  51. add_edge(v2[8], v2[6], g2); add_edge(v2[6], v2[4], g2);
  52. std::vector<graph_traits<graph_t>::vertex_descriptor> f(n);
  53. #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
  54. bool ret = isomorphism
  55. (g1, g2, make_iterator_property_map(f.begin(), v1_index_map, f[0]),
  56. degree_vertex_invariant(), get(vertex_index, g1), get(vertex_index, g2));
  57. #else
  58. bool ret = isomorphism
  59. (g1, g2, isomorphism_map
  60. (make_iterator_property_map(f.begin(), v1_index_map, f[0])));
  61. #endif
  62. std::cout << "isomorphic? " << ret << std::endl;
  63. std::cout << "f: ";
  64. for (std::size_t v = 0; v != f.size(); ++v)
  65. std::cout << get(get(vertex_index, g2), f[v]) << " ";
  66. std::cout << std::endl;
  67. return 0;
  68. }