biconnected_components.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //=======================================================================
  2. // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //=======================================================================
  8. #include <boost/config.hpp>
  9. #include <vector>
  10. #include <list>
  11. #include <boost/graph/biconnected_components.hpp>
  12. #include <boost/graph/adjacency_list.hpp>
  13. #include <iterator>
  14. #include <iostream>
  15. namespace boost
  16. {
  17. struct edge_component_t
  18. {
  19. enum
  20. { num = 555 };
  21. typedef edge_property_tag kind;
  22. }
  23. edge_component;
  24. }
  25. int
  26. main()
  27. {
  28. using namespace boost;
  29. typedef adjacency_list < vecS, vecS, undirectedS,
  30. no_property, property < edge_component_t, std::size_t > >graph_t;
  31. typedef graph_traits < graph_t >::vertex_descriptor vertex_t;
  32. graph_t g(9);
  33. add_edge(0, 5, g);
  34. add_edge(0, 1, g);
  35. add_edge(0, 6, g);
  36. add_edge(1, 2, g);
  37. add_edge(1, 3, g);
  38. add_edge(1, 4, g);
  39. add_edge(2, 3, g);
  40. add_edge(4, 5, g);
  41. add_edge(6, 8, g);
  42. add_edge(6, 7, g);
  43. add_edge(7, 8, g);
  44. property_map < graph_t, edge_component_t >::type
  45. component = get(edge_component, g);
  46. std::size_t num_comps = biconnected_components(g, component);
  47. std::cerr << "Found " << num_comps << " biconnected components.\n";
  48. std::vector<vertex_t> art_points;
  49. articulation_points(g, std::back_inserter(art_points));
  50. std::cerr << "Found " << art_points.size() << " articulation points.\n";
  51. std::cout << "graph A {\n" << " node[shape=\"circle\"]\n";
  52. for (std::size_t i = 0; i < art_points.size(); ++i) {
  53. std::cout << (char)(art_points[i] + 'A')
  54. << " [ style=\"filled\", fillcolor=\"red\" ];"
  55. << std::endl;
  56. }
  57. graph_traits < graph_t >::edge_iterator ei, ei_end;
  58. for (boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
  59. std::cout << (char)(source(*ei, g) + 'A') << " -- "
  60. << (char)(target(*ei, g) + 'A')
  61. << "[label=\"" << component[*ei] << "\"]\n";
  62. std::cout << "}\n";
  63. return 0;
  64. }