Reader.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include <climits>
  2. #include <fstream>
  3. #include <iostream>
  4. #include "Reader.h"
  5. const std::string& Reader::getName(int id) {
  6. return names[id];
  7. }
  8. const std::vector<int>& Reader::operator[](int x) const {
  9. return distances[x];
  10. }
  11. int Reader::getSize() const {
  12. return ids;
  13. }
  14. int Reader::getOrAddId(const std::string& s) {
  15. auto found = nameToId.find(s);
  16. if(found != nameToId.end()) {
  17. return found->second;
  18. }
  19. int id = ids++;
  20. nameToId[s] = id;
  21. for(std::vector<int>& inner : distances) {
  22. inner.push_back(-1);
  23. }
  24. distances.push_back(std::vector<int>(ids, -1));
  25. distances.back()[ids - 1] = 0;
  26. names.push_back(s);
  27. return id;
  28. }
  29. std::string Reader::trim(const std::string& s) const {
  30. size_t start = 0;
  31. while(start < s.length() && s[start] == ' ') {
  32. start++;
  33. }
  34. size_t end = s.length();
  35. while(end > 0 && s[end - 1] == ' ') {
  36. end--;
  37. }
  38. return s.substr(start, end - start);
  39. }
  40. bool Reader::read(const char* path) {
  41. std::ifstream in;
  42. in.open(path);
  43. if(!in.good()) {
  44. std::cout << "cannot find data\n";
  45. return true;
  46. }
  47. while(!in.eof()) {
  48. std::string s;
  49. std::getline(in, s);
  50. if(s.find("road(", 0) != 0) {
  51. continue;
  52. }
  53. s = s.substr(5, s.length() - 5);
  54. size_t fromIndex = s.find(",", 0);
  55. if(fromIndex == s.npos) {
  56. continue;
  57. }
  58. size_t toIndex = s.find(",", fromIndex + 1);
  59. if(toIndex == s.npos) {
  60. continue;
  61. }
  62. size_t distanceIndex = s.find(")", toIndex + 1);
  63. if(distanceIndex == s.npos) {
  64. continue;
  65. }
  66. std::string from = trim(s.substr(0, fromIndex));
  67. std::string to = trim(s.substr(fromIndex + 1, toIndex - fromIndex - 1));
  68. std::string distanceString =
  69. trim(s.substr(toIndex + 1, distanceIndex - toIndex - 1));
  70. int fromId = getOrAddId(from);
  71. int toId = getOrAddId(to);
  72. int distance = std::stoi(distanceString);
  73. distances[fromId][toId] = distance;
  74. distances[toId][fromId] = distance;
  75. }
  76. for(int i = 0; i < ids; i++) {
  77. distance(i);
  78. }
  79. return false;
  80. }
  81. void Reader::print() const {
  82. for(size_t x = 0; x < distances.size(); x++) {
  83. for(size_t y = 0; y < distances[x].size(); y++) {
  84. printf("%3d ", distances[x][y]);
  85. }
  86. std::cout << "\n";
  87. }
  88. }
  89. struct Node {
  90. int distance = INT_MAX;
  91. bool visited = false;
  92. };
  93. static bool notAllVisited(const std::vector<Node>& nodes) {
  94. for(const Node& n : nodes) {
  95. if(!n.visited) {
  96. return true;
  97. }
  98. }
  99. return false;
  100. }
  101. void Reader::distance(int column) {
  102. std::vector<Node> nodes(ids, Node());
  103. nodes[column].distance = 0;
  104. while(notAllVisited(nodes)) {
  105. size_t minIndex = 0;
  106. int minDistance = INT_MAX;
  107. for(size_t i = 0; i < nodes.size(); i++) {
  108. if(!nodes[i].visited && nodes[i].distance < minDistance) {
  109. minIndex = i;
  110. minDistance = nodes[i].distance;
  111. }
  112. }
  113. nodes[minIndex].visited = true;
  114. for(int i = 0; i < ids; i++) {
  115. if(!nodes[i].visited && distances[minIndex][i] != -1) {
  116. int newDistance = minDistance + distances[minIndex][i];
  117. if(newDistance < nodes[i].distance) {
  118. nodes[i].distance = newDistance;
  119. }
  120. }
  121. }
  122. }
  123. for(size_t i = 0; i < nodes.size(); i++) {
  124. distances[column][i] = nodes[i].distance;
  125. }
  126. }