ParanoidPanda

Untitled

Dec 22nd, 2015
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. struct goveman{ //структура описания "чиновника" который выдает справки
  7. std::vector<char> canTake; //какие справки он может выдать
  8. std::vector<char> needIt; //какие справки необходимы что бы он выдал справки
  9. int ver; //номер вершины, так как у нас все это представление в виде графа
  10. };
  11.  
  12. class topological{
  13. private:
  14. goveman *inform; //объявление массива структур
  15. int countofver; //количество вершин
  16. bool *visited; //массив "посещеных вершин"
  17. bool **graph; //матрица смежности нашего графа
  18. int *result; //оптимальный результат
  19. int step = 0; //необходимая переменная для некоторых манипуляций
  20. std::string loadfilename; //имя файла откуда загружать
  21. std::string savefilename; //имя файла куда сохранять
  22. public:
  23. topological(std::string loadfilename, std::string savefilename); //конструктор класса
  24. void loadfromfile(); //функция загрузки из файла
  25. void parceit(char *string); //функция разделения строки на необходимые для нас части
  26. void analistateit(); //анализ полученных данных в граф
  27. void mainalgo(); //главный алгоритм
  28. void savetofile(); //сохранение в файл
  29. void deepfind(int ver); //поиск в глубину в графе
  30. };
  31.  
  32. topological::topological(std::string loadfilename, std::string savefilename){
  33. this->loadfilename = loadfilename; //присвоение имени
  34. this->savefilename = savefilename; //присвоение имени
  35. }
  36.  
  37. void topological::loadfromfile(){
  38. //открытие файла с нашим представлением чиновников
  39. std::ifstream fin;
  40. fin.open(loadfilename.c_str());
  41. int counter = 0;
  42. char buff[1024];
  43. //подсчет количества строк в файле - кол-во строк = кол-ву вершин
  44. while (!fin.eof()){
  45. fin.getline(buff, 1024, '\n');
  46. counter++;
  47. }
  48. //выделение всех необходимых мест в памяти под необходимые массивы
  49. inform = new goveman[counter];
  50. graph = new bool*[counter];
  51. for (int i = 0; i < counter; i++){
  52. graph[i] = new bool[counter];
  53. }
  54. fin.seekg(0, fin.beg); //переходим обратно в начало файла
  55. for (int i = 0; i < counter; i++){
  56. for (int j = 0; j < counter; j++){
  57. graph[i][j] = 0; //так как у нас массив с графом "пустой" - в нем нет никаких значений кроме нижней границы байта блять чтоли заполняем его нулями
  58. }
  59. }
  60. countofver = counter;
  61. result = new int[counter];
  62. visited = new bool[counter];
  63. //начинаем ебарить каждую строчку файла чтобы вынуть необходимые для нас вещи
  64. while (!fin.eof()){
  65. fin.getline(buff, 1024, '\n');
  66. parceit(buff);
  67. }
  68. }
  69.  
  70. void topological::parceit(char *string){ //функция разделения я тебе ее рассказывал
  71. bool hook = false;
  72. for (int i = 0; i < strlen(string); i++){
  73. if (string[i] >= '0' && string[i] <= '9')
  74. inform[step].ver = string[i] - 48;
  75. if (string[i] == '|')
  76. hook = true;
  77. if (hook==false && (string[i] >= 'A' && string[i] <= 'Z')){
  78. inform[step].canTake.push_back(string[i]);
  79. }
  80. if (hook == true && (string[i] >= 'A' && string[i] <= 'Z')){
  81. inform[step].needIt.push_back(string[i]);
  82. }
  83. }
  84. step++;
  85. }
  86.  
  87. void topological::analistateit(){ //функция построения графа тоже рассказывал
  88. step = 0;
  89. for (int i = 0; i < countofver; i++){
  90. for (int j = 0; j < countofver; j++){
  91. for (int k = 0; k < inform[i].needIt.size(); k++){
  92. for (int p = 0; p < inform[j].canTake.size(); p++){
  93. if (inform[i].needIt[k] == inform[j].canTake[p]){
  94. graph[j][i] = 1;
  95. }
  96. }
  97. }
  98. }
  99. }
  100. }
  101.  
  102. void topological::mainalgo(){
  103. for (int i = 0; i < countofver; i++)
  104. visited[i] = false;
  105. for (int i = 0; i < countofver; i++){
  106. if (!visited[i]){
  107. deepfind(i);
  108. }
  109. }
  110. //переворачиваем массив
  111. for (int i = 0, j = countofver - 1; i < j; i++, j--){
  112. int tmp = result[i];
  113. result[i] = result[j];
  114. result[j] = tmp;
  115. }
  116. for (int i = 0; i < countofver; i++)
  117. std::cout << result[i] << " ";
  118. }
  119.  
  120. void topological::deepfind(int ver){
  121. visited[ver] = true;
  122. for (int i = 0; i < countofver + 1; i++){
  123. if (graph[ver][i] && !visited[i]){
  124. deepfind(i);
  125. }
  126. }
  127. result[step] = ver;
  128. step++;
  129. }
  130.  
  131. void topological::savetofile(){
  132. bool **buffer = new bool*[countofver];
  133. for (int i = 0; i < countofver; i++){
  134. buffer[i] = new bool [countofver];
  135. }
  136. for (int i = 0; i < countofver; i++){
  137. for (int j = 0; j < countofver; j++){
  138. buffer[i][j] = graph[result[i]][j];
  139. }
  140. }
  141. for (int i = 0; i < countofver; i++){
  142. for (int j = 0; j < countofver; j++){
  143. graph[i][j] = buffer[i][result[j]];
  144. }
  145. }
  146. std::ofstream file(savefilename.c_str());
  147. file << "digraph {\n";
  148. file << "rankdir=LR;" << std::endl;
  149. for (int i = 0; i < countofver - 1; i++){
  150. file << result[i]+1 << "->" << result[i + 1]+1 << ";" << std::endl;
  151. }
  152. file << "}\n";
  153. file.close();
  154. }
  155.  
  156. int main(){
  157. topological object("time.txt", "out.txt");
  158. object.loadfromfile();
  159. object.analistateit();
  160. object.mainalgo();
  161. object.savetofile();
  162. return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment