Guest User

Untitled

a guest
Jun 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. // compile-run-remove - "> g++ graph.cpp -std=c++11 -o gr && ./gr; rm ./gr"
  2. #include <iostream>
  3.  
  4. class Graph {
  5. #define MAX 1000
  6.  
  7. struct IdSet {
  8. bool set[MAX];
  9.  
  10. IdSet() {
  11. for (unsigned i = 0; i < MAX; i++) set[i] = false;
  12. }
  13.  
  14. bool insert(unsigned value) { return value < MAX && (set[value] = true); }
  15.  
  16. bool has(unsigned value) { return value < MAX && set[value]; }
  17. };
  18.  
  19. struct Node {
  20. unsigned value, child_ids[MAX], size;
  21.  
  22. Node(unsigned _value = 0) : value(_value), size(0) {}
  23.  
  24. void add_child(unsigned child_id) {
  25. if (child_id < MAX && size < MAX) child_ids[size++] = child_id;
  26. }
  27. };
  28.  
  29. Node nodes[MAX];
  30. int index_map[MAX];
  31. unsigned size;
  32.  
  33. public:
  34. Graph() : size(0) {
  35. for (unsigned i = 0; i < MAX; i++) index_map[i] = -1;
  36. }
  37.  
  38. void add_vertex(unsigned value) {
  39. if (size < MAX && value < MAX && index_map[value] == -1) {
  40. unsigned id = size++;
  41. nodes[id] = Node(value);
  42. index_map[value] = id;
  43. }
  44. }
  45.  
  46. void add_edge(unsigned from_value, unsigned to_value) {
  47. if (from_value < MAX && to_value < MAX) {
  48. add_vertex(from_value);
  49. add_vertex(to_value);
  50. nodes[index_map[from_value]].add_child(index_map[to_value]);
  51. }
  52. }
  53.  
  54. bool is_connected() {
  55. for (unsigned i = 0; i < size; i++)
  56. for (unsigned j = i + 1; j < size; j++) {
  57. IdSet ij_set, ji_set;
  58. if (!path_exists(i, j, ij_set) && !path_exists(j, i, ji_set))
  59. return false;
  60. }
  61.  
  62. return true;
  63. }
  64.  
  65. private:
  66. bool path_exists(unsigned from, unsigned to, IdSet &visited) {
  67. if (from == to) return true;
  68. if (visited.has(from)) return false;
  69. visited.insert(from);
  70.  
  71. for (unsigned i = 0; i < nodes[from].size; i++)
  72. if (path_exists(nodes[from].child_ids[i], to, visited)) return true;
  73.  
  74. return false;
  75. }
  76. };
  77.  
  78. int main() {
  79. Graph connected;
  80. Graph disconnected;
  81.  
  82. connected.add_edge(1, 2);
  83. connected.add_edge(2, 3);
  84.  
  85. disconnected.add_edge(2, 1);
  86. disconnected.add_edge(2, 3);
  87.  
  88. std::cout << "Should be true: " << connected.is_connected() << std::endl;
  89. std::cout << "Should be false: " << disconnected.is_connected() << std::endl;
  90.  
  91. return 0;
  92. }
Add Comment
Please, Sign In to add comment