graph.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. int get_number_from_string(int start, string word) {
  61. int dec = 1, res = 0;
  62. while (start>=0 && word[start] >= 48 && word[start] <= 57 ) {
  63. res += ((word[start] - 48) * dec);
  64. dec *= 10;
  65. start--;
  66. }
  67. return res;
  68. }
  69. void Graph::read_file(string file_name)
  70. {
  71. ifstream input;
  72. input.open(file_name);
  73. map <string, Node> saved;
  74. if (input.is_open()) {
  75. string line;
  76. getline(input, line);
  77. while (getline(input, line)) {
  78. string fir = "", sec = "";
  79. int splitter = 0;
  80. while (line[splitter] != '\t')
  81. {
  82. fir += line[splitter];
  83. splitter++;
  84. }
  85. splitter++;
  86. while (line[splitter])
  87. {
  88. sec += line[splitter];
  89. splitter++;
  90. }
  91. saved[fir] = taken_names[fir] ? saved[fir] : Node(fir);
  92. saved[sec] = taken_names[sec] ? saved[sec] : Node(sec);
  93. add_node(&saved[fir]);
  94. add_node(&saved[sec]);
  95. add_edge(&saved[fir], &saved[sec]);
  96. }
  97. }
  98. }