dijkstra-no-color-map-example.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //=======================================================================
  2. // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee
  3. // Copyright 2009 Trustees of Indiana University.
  4. // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // NOTE: Based off of dijkstra-example.cpp
  11. //=======================================================================
  12. #include <boost/config.hpp>
  13. #include <iostream>
  14. #include <fstream>
  15. #include <boost/graph/graph_traits.hpp>
  16. #include <boost/graph/adjacency_list.hpp>
  17. #include <boost/graph/dijkstra_shortest_paths_no_color_map.hpp>
  18. #include <boost/property_map/property_map.hpp>
  19. using namespace boost;
  20. int
  21. main(int, char *[])
  22. {
  23. typedef adjacency_list < listS, vecS, directedS,
  24. no_property, property < edge_weight_t, int > > graph_t;
  25. typedef graph_traits < graph_t >::vertex_descriptor vertex_descriptor;
  26. typedef std::pair<int, int> Edge;
  27. const int num_nodes = 5;
  28. enum nodes { A, B, C, D, E };
  29. char name[] = "ABCDE";
  30. Edge edge_array[] = { Edge(A, C), Edge(B, B), Edge(B, D), Edge(B, E),
  31. Edge(C, B), Edge(C, D), Edge(D, E), Edge(E, A), Edge(E, B)
  32. };
  33. int weights[] = { 1, 2, 1, 2, 7, 3, 1, 1, 1 };
  34. int num_arcs = sizeof(edge_array) / sizeof(Edge);
  35. graph_t g(edge_array, edge_array + num_arcs, weights, num_nodes);
  36. property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g);
  37. std::vector<vertex_descriptor> p(num_vertices(g));
  38. std::vector<int> d(num_vertices(g));
  39. vertex_descriptor s = vertex(A, g);
  40. dijkstra_shortest_paths_no_color_map(g, s,
  41. predecessor_map(boost::make_iterator_property_map(p.begin(), get(boost::vertex_index, g))).
  42. distance_map(boost::make_iterator_property_map(d.begin(), get(boost::vertex_index, g))));
  43. std::cout << "distances and parents:" << std::endl;
  44. graph_traits < graph_t >::vertex_iterator vi, vend;
  45. for (boost::tie(vi, vend) = vertices(g); vi != vend; ++vi) {
  46. std::cout << "distance(" << name[*vi] << ") = " << d[*vi] << ", ";
  47. std::cout << "parent(" << name[*vi] << ") = " << name[p[*vi]] << std::
  48. endl;
  49. }
  50. std::cout << std::endl;
  51. std::ofstream dot_file("figs/dijkstra-no-color-map-eg.dot");
  52. dot_file << "digraph D {\n"
  53. << " rankdir=LR\n"
  54. << " size=\"4,3\"\n"
  55. << " ratio=\"fill\"\n"
  56. << " edge[style=\"bold\"]\n" << " node[shape=\"circle\"]\n";
  57. graph_traits < graph_t >::edge_iterator ei, ei_end;
  58. for (boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) {
  59. graph_traits < graph_t >::edge_descriptor e = *ei;
  60. graph_traits < graph_t >::vertex_descriptor
  61. u = source(e, g), v = target(e, g);
  62. dot_file << name[u] << " -> " << name[v]
  63. << "[label=\"" << get(weightmap, e) << "\"";
  64. if (p[v] == u)
  65. dot_file << ", color=\"black\"";
  66. else
  67. dot_file << ", color=\"grey\"";
  68. dot_file << "]";
  69. }
  70. dot_file << "}";
  71. return EXIT_SUCCESS;
  72. }