Advertisement
VladimirKostovsky

Невыносимая легкость бытия. Часть 1

May 30th, 2022
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4.  
  5. namespace Global {
  6.     int Sum_from_cycle; // временная переменная в цикле
  7.     int Town_from_cycle; // временная переменная индекса
  8.     int Sum_final = 100000; // минимальная сумма
  9.     int Town_final; // город
  10. };
  11.  
  12. using namespace std;
  13. using namespace Global;
  14.  
  15. fstream fin;
  16. ofstream fout;
  17.  
  18. int** CreateMap(int** r, int n) {
  19.     int i, j;
  20.     for (i = 0; i < n; i++) {
  21.         r[i][i] = 0;
  22.         for (j = i + 1; j < n; j++) {
  23.             r[i][j] = 0;
  24.             r[j][i] = r[i][j];
  25.         }
  26.     }
  27.     return r;
  28. }
  29. int CheckSpace(int** map, int n) {
  30.     bool CheckSpace = true;
  31.     for (int i = 0; i < n; i++)
  32.         for (int j = 0; j < n; j++)
  33.             if (map[i][j] != 0) { CheckSpace = false; }
  34.     if (CheckSpace = true) {
  35.         cout << "В введенных данных не заданы расстояния между городами. ";  return 1;
  36.     }
  37. }
  38.  
  39. void PrintMap(int** map, int n) {
  40.     int i, j;
  41.     for (i = 0; i < n; i++) {
  42.         for (j = 0; j < n; j++)
  43.             fout << setw(5) << map[i][j] << " ";
  44.         fout << '\n';
  45.     }
  46. }
  47.  
  48. int main() {
  49.     setlocale(LC_ALL, "ru");
  50.     int temp, minindex, min;
  51.     fin.open("input.txt");
  52.     fout.open("out.txt");
  53.     if (!fin.is_open())
  54.         cout << "Файл не открылся! Проверь название/существование" << endl;
  55.     else {
  56.         cout << "Чтение из файла произведено успешно." << endl;
  57.  
  58.         int n;
  59.         fin >> n; // ввод количества городов
  60.         if (n > 1) {
  61.             int i, j;
  62.             string* town = new string[n]; // массив с названиями городов
  63.             for (i = 0; i < n; i++)
  64.                 fin >> town[i];
  65.             string typeroad, town1, town2;
  66.             int town_index1, town_index2, way;
  67.             int** map = new int* [n]; // таблица смежности
  68.             for (i = 0; i < n; i++)
  69.                 map[i] = new int[n];
  70.             map = CreateMap(map, n);
  71.             while (fin) { //Ввод систем дорог
  72.                 fin >> town1 >> town2 >> way;
  73.                 bool count_town1 = false, count_town2 = false;
  74.                 for (int e = 0; e < n; e++)
  75.                 {
  76.                     if (town1 == town[e]) { town_index1 = e; {if (count_town1 == false) { count_town1 = true; }} }
  77.                     else if (town2 == town[e]) { town_index2 = e; {if (count_town2 == false) { count_town2 = true; }} }
  78.                 }
  79.  
  80.                 if (count_town1 == true && count_town2 == true) {
  81.                     if (map[town_index1][town_index2] == 0 && way > 0)
  82.                     {
  83.                         map[town_index1][town_index2] = way;
  84.                         map[town_index2][town_index1] = way;
  85.                     }
  86.                     else if (way < map[town_index1][town_index2] && way > 0)
  87.                     {
  88.                         map[town_index1][town_index2] = way;
  89.                         map[town_index2][town_index1] = way;
  90.                     }
  91.                     else if (way < 0) fout << "Не верно задано расстояние между " << town1 << " и " << town2 << '\n';
  92.                 }
  93.                 else {
  94.                     cout << "Задано больше городов, чем доступно памяти" << endl;
  95.                 }
  96.             }
  97.             if (town1 == town2) { town_index1 = 0; town_index2 = 0; fout << "Найдена и проигнорирована петля " << town1 << endl; }
  98.             CheckSpace(map, n);
  99.             PrintMap(map, n);
  100.  
  101.             // Начало работы с файлами
  102.             int* min_length = new int[n]; // информация о минимальной длине
  103.             int* check_this_out = new int[n]; // флажок о входе в данный город
  104.             int summa_min = 0; // создаем переменную для
  105.  
  106.             for (i = 0; i < n; i++) {
  107.                 min_length[i] = 100000;
  108.                 check_this_out[i] = 1;
  109.             }
  110.             // АЛГОРИТМ ДЕЙКСТРЫ
  111.             for (int j = 0; j < n; j++) {
  112.                 min_length[j] = 0; // обнуляем переменную минимальной длины
  113.                 do {
  114.                     minindex = 100000; // выставляем недостижимыми значения
  115.                     min = 100000; // я
  116.                     for (int i = 0; i < n; i++) {
  117.                         if ((check_this_out[i] == 1) && (min_length[i] < min)) {
  118.                             min = min_length[i];
  119.                             minindex = i;
  120.                         }
  121.                     }
  122.                     if (minindex != 100000) {
  123.                         for (int i = 0; i < n; i++) {
  124.                             if (map[minindex][i] > 0) {
  125.                                 temp = min + map[minindex][i];
  126.                                 if (temp < min_length[i]) {
  127.                                     min_length[i] = temp;
  128.                                 }
  129.                             }
  130.                         }
  131.                         check_this_out[minindex] = 0;
  132.                     }
  133.                 } while (minindex < 100000); // пока не закончатся города, в которые еще ни разу не заходили
  134.  
  135.  
  136.                 for (int m = 0; m < n; m++)
  137.                     summa_min += min_length[m];  // нахождение минимального значения
  138.                 Sum_from_cycle = summa_min;
  139.                 Town_from_cycle = j;
  140.                 summa_min = 0;
  141.                 for (i = 0; i < n; i++) {
  142.                     min_length[i] = 100000;
  143.                     check_this_out[i] = 1;
  144.                 }
  145.                 if (Sum_from_cycle < Sum_final) {
  146.                     Sum_final = Sum_from_cycle;
  147.                     Town_final = j;
  148.                 }
  149.             }
  150.             fout << "Город с минимальной суммой расстояний до других городов: " << town[Town_final] << " cо значением - " << Sum_final << endl;
  151.         }
  152.         cout << "Данные записаны в файл";
  153.     }
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement