graph.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "graph.h"
  2. void Node::add_neigboor(Node* neighboor)
  3. {
  4. neighboors.insert(neighboor);
  5. }
  6. void Node::remove_neighboor(Node* neighboor)
  7. {
  8. neighboors.erase(neighboor);
  9. }
  10. Node::Node()
  11. {
  12. }
  13. Node::Node(const string& aname)
  14. {
  15. name = aname;
  16. }
  17. const string Node::get_name() const
  18. {
  19. return name;
  20. }
  21. const bool& Node::operator==(const Node& r)
  22. {
  23. return name == r.name;
  24. }
  25. void Graph::add_node(Node* node)
  26. {
  27. if (taken_names[node->name]) {
  28. throw Graph_exception();
  29. }
  30. else {
  31. taken_names[node->name] = true;
  32. nodes.insert(node);
  33. }
  34. }
  35. void Graph::remove_node(Node* node)
  36. {
  37. nodes.erase(node);
  38. for (set<Node*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
  39. (*it)->remove_neighboor(node);
  40. }
  41. }
  42. void Graph::add_edge(Node* begin, Node* end)
  43. {
  44. if (nodes.find(begin) == nodes.end())
  45. return;
  46. if (nodes.find(end) == nodes.end())
  47. return;
  48. begin->add_neigboor(end);
  49. end->add_neigboor(begin);
  50. }
  51. void Graph::remove_edge(Node* begin, Node* end)
  52. {
  53. if (nodes.find(begin) == nodes.end())
  54. return;
  55. if (nodes.find(end) == nodes.end())
  56. return;
  57. begin->remove_neighboor(end);
  58. end->remove_neighboor(begin);
  59. }
  60. void Graph::read_file(string file_name)
  61. {
  62. ifstream input;
  63. input.open(file_name);
  64. if (input.is_open()) {
  65. string line;
  66. getline(input, line);
  67. while (getline(input, line)) {
  68. string fir = "", sec = "";
  69. int splitter = 0;
  70. while (line[splitter] != '\t')
  71. {
  72. fir += line[splitter];
  73. splitter++;
  74. }
  75. splitter++;
  76. while (line[splitter])
  77. {
  78. sec += line[splitter];
  79. splitter++;
  80. }
  81. saved[fir] = taken_names[fir] ? saved[fir] : Node(fir);
  82. saved[sec] = taken_names[sec] ? saved[sec] : Node(sec);
  83. try {
  84. add_node(&saved[fir]);
  85. }
  86. catch (Graph_exception & ex) {}
  87. try {
  88. add_node(&saved[sec]);
  89. }
  90. catch (Graph_exception & ex) {}
  91. add_edge(&saved[fir], &saved[sec]);
  92. }
  93. }
  94. input.close();
  95. }
  96. void Graph::write_graph(vector <vector <node_iterator> > ind)
  97. {
  98. int size = ind.size();
  99. for (int i = 0; i < size; i++) {
  100. string c_name = "graph";
  101. c_name += (i + 49);
  102. c_name += ".txt";
  103. ofstream out(c_name);
  104. for (int j = 0; j < ind[i].size(); j++) {
  105. Node * const cur = *ind[i][j];
  106. node_iterator it = cur->neighboors.begin();
  107. while (it != cur->neighboors.end()) {
  108. Node* const neighb = *it;
  109. out << cur->name << '\t' << neighb->name << '\n';
  110. it++;
  111. }
  112. }
  113. out.close();
  114. }
  115. }
  116. void Graph::find_independent_graphs()
  117. {
  118. int size = nodes.size();
  119. vector <vector <node_iterator> > independent;
  120. set<Node*> working_nodes = nodes;
  121. for (int i = 0; i <size; i++) {
  122. set<Node*>::iterator it = working_nodes.begin(), compared = working_nodes.begin();
  123. vector<node_iterator> tmp_nodes;
  124. tmp_nodes.push_back(nodes.find(*it));
  125. BFS fs(*this);
  126. compared++;
  127. while (compared != working_nodes.end()) {
  128. if(fs.connected(*it, *compared))
  129. tmp_nodes.push_back(nodes.find(*compared));
  130. compared++;
  131. }
  132. independent.push_back(tmp_nodes);
  133. for (int i = 0; i < tmp_nodes.size(); i++) {
  134. working_nodes.erase(working_nodes.find(*tmp_nodes[i]));
  135. size--;
  136. }
  137. }
  138. write_graph(independent);
  139. }