graph.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //=======================================================================
  2. // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
  3. // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
  4. //
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //=======================================================================
  9. #include <boost/config.hpp>
  10. #include <iostream>
  11. #include <vector>
  12. #include <utility>
  13. #include <algorithm>
  14. #include <boost/graph/adjacency_list.hpp>
  15. using namespace boost;
  16. using namespace std;
  17. typedef property<vertex_color_t, default_color_type,
  18. property<vertex_distance_t,int,
  19. property<vertex_degree_t,int,
  20. property<vertex_in_degree_t, int,
  21. property<vertex_out_degree_t,int> > > > > VertexProperty;
  22. typedef property<edge_weight_t,int> EdgeProperty;
  23. typedef adjacency_list<vecS, vecS, bidirectionalS,
  24. VertexProperty, EdgeProperty> Graph;
  25. template <class Graph>
  26. void print(Graph& g) {
  27. typename Graph::vertex_iterator i, end;
  28. typename Graph::out_edge_iterator ei, edge_end;
  29. for(boost::tie(i,end) = vertices(g); i != end; ++i) {
  30. cout << *i << " --> ";
  31. for (boost::tie(ei,edge_end) = out_edges(*i, g); ei != edge_end; ++ei)
  32. cout << target(*ei, g) << " ";
  33. cout << endl;
  34. }
  35. }
  36. std::size_t myrand(std::size_t N) {
  37. std::size_t ret = rand() % N;
  38. // cout << "N = " << N << " rand = " << ret << endl;
  39. return ret;
  40. }
  41. template <class Graph>
  42. bool check_edge(Graph& g, std::size_t a, std::size_t b) {
  43. typename Graph::adjacency_iterator vi, viend, found;
  44. boost::tie(vi, viend) = adjacent_vertices(vertex(a,g), g);
  45. found = find(vi, viend, vertex(b, g));
  46. if ( found == viend )
  47. return false;
  48. return true;
  49. }
  50. int main(int, char*[])
  51. {
  52. std::size_t N = 5;
  53. Graph g(N);
  54. int i;
  55. bool is_failed = false;
  56. for (i=0; i<6; ++i) {
  57. std::size_t a = myrand(N), b = myrand(N);
  58. while ( a == b ) b = myrand(N);
  59. cout << "edge edge (" << a << "," << b <<")" << endl;
  60. //add edges
  61. add_edge(a, b, g);
  62. is_failed = is_failed || (! check_edge(g, a, b) );
  63. }
  64. if ( is_failed )
  65. cerr << " Failed."<< endl;
  66. else
  67. cerr << " Passed."<< endl;
  68. print(g);
  69. //remove_edge
  70. for (i = 0; i<2; ++i) {
  71. std::size_t a = myrand(N), b = myrand(N);
  72. while ( a == b ) b = myrand(N);
  73. cout << "remove edge (" << a << "," << b <<")" << endl;
  74. remove_edge(a, b, g);
  75. is_failed = is_failed || check_edge(g, a, b);
  76. }
  77. if ( is_failed )
  78. cerr << " Failed."<< endl;
  79. else
  80. cerr << " Passed."<< endl;
  81. print(g);
  82. //add_vertex
  83. is_failed = false;
  84. std::size_t old_N = N;
  85. std::size_t vid = add_vertex(g);
  86. std::size_t vidp1 = add_vertex(g);
  87. N = num_vertices(g);
  88. if ( (N - 2) != old_N )
  89. cerr << " Failed."<< endl;
  90. else
  91. cerr << " Passed."<< endl;
  92. is_failed = false;
  93. for (i=0; i<2; ++i) {
  94. std::size_t a = myrand(N), b = myrand(N);
  95. while ( a == vid ) a = myrand(N);
  96. while ( b == vidp1 ) b = myrand(N);
  97. cout << "add edge (" << vid << "," << a <<")" << endl;
  98. cout << "add edge (" << vid << "," << vidp1 <<")" << endl;
  99. add_edge(vid, a, g);
  100. add_edge(b, vidp1, g);
  101. is_failed = is_failed || ! check_edge(g, vid, a);
  102. is_failed = is_failed || ! check_edge(g, b, vidp1);
  103. }
  104. if ( is_failed )
  105. cerr << " Failed."<< endl;
  106. else
  107. cerr << " Passed."<< endl;
  108. print(g);
  109. // clear_vertex
  110. std::size_t c = myrand(N);
  111. is_failed = false;
  112. clear_vertex(c, g);
  113. if ( out_degree(c, g) != 0 )
  114. is_failed = true;
  115. cout << "Removing vertex " << c << endl;
  116. remove_vertex(c, g);
  117. old_N = N;
  118. N = num_vertices(g);
  119. if ( (N + 1) != old_N )
  120. is_failed = true;
  121. if ( is_failed )
  122. cerr << " Failed."<< endl;
  123. else
  124. cerr << " Passed."<< endl;
  125. print(g);
  126. return 0;
  127. }