Advertisement
evgenko

Floyd–Warshall algorithm

Apr 13th, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <climits>
  4. #include <iomanip>
  5.  
  6. #define toversh first
  7. #define dist second
  8. int n;
  9. using namespace std;
  10.  
  11. int main() {
  12.     cin >> n; //считываем кол-во вершин
  13.     int m;
  14.     cin >> m;  // считчывем односторонних связей
  15.     vector<pair<int, int> > graph[n];   // vector - динамическая структура (массив с неопределенной размерностью), pair - структура у которой есть два параметра (first и second)
  16.     int distance[n][n];     //массив в котором будем хранить растояние от i к j вершине
  17.     int vtorayatab[n][n];   //там на лекции была ещё одна таблица, не запомнил её название, вообщем вот она
  18.     /*
  19.      * Cчитываем граф
  20.      *
  21.      * Формат ввода данных: от вершини к верине такая-то цена ребра
  22.      * Пример: 1 2 60
  23.      * От вершини 1 к вершине 2 есть ребро с ценой в 60
  24.      *
  25.      */
  26.     for (int i = 0; i < m; i++) {
  27.         int from, to, price, type;
  28.         cin >> from >> to >> price;// >> type;
  29.         graph[from - 1].push_back(make_pair(to - 1, price));
  30.         //if (type == 0) {
  31.         //  a[to].push_back(make_pair(from, price));
  32.         //}
  33.     }
  34.  
  35.     /*
  36.      * Подготавливаем все для алгоритма Флойда
  37.      *
  38.      * Все не найденные дистанции помечаем бесконечностью, дистанции в теже точки (из 1 в 1) помечаем 0
  39.      * а так-же отмечаем растояния между известными рёбрами
  40.      *
  41.      */
  42.     for (int i = 0; i < n; i++) {
  43.         for (int j = 0; j < n; j++) {
  44.             distance[i][j] = INT_MAX;
  45.             vtorayatab[i][j] = j + 1;
  46.             if (i == j) {
  47.                 distance[i][j] = 0;
  48.             }
  49.                 vtorayatab[i][j] = 0;
  50.  
  51.         }
  52.         for (int j = 0; j < graph[i].size(); j++) {
  53.             distance[i][graph[i][j].toversh] = graph[i][j].dist;
  54.             vtorayatab[i][graph[i][j].toversh] = graph[i][j].toversh+1;
  55.         }
  56.     }
  57.  
  58.     //Вывод данных для проверки ввода
  59.     for (int i = 0; i < n; i++) {
  60.         for (int j = 0; j < n; j++) {
  61.             if (distance[i][j] == INT_MAX){
  62.                 cout << setw(5) << "-";     // setw() - для красивого вывода таблиц   ;)
  63.             }else
  64.                 cout << setw(5) <<  distance[i][j];
  65.         }
  66.         cout << "     ";
  67.         for (int j = 0; j < n; j++) {
  68.             cout << setw(3) << vtorayatab[i][j];
  69.         }
  70.         cout << endl;
  71.     }
  72.     cout << endl << endl;
  73.  
  74.     /*
  75.      * Тут ниже сам алгоритм Флойда
  76.      *
  77.      * Ну на каждой итерации выбираем вершину по которой строим столбец и строку
  78.      * Если есть дистанция в i,j вершину короче то записываем её
  79.      *
  80.      *
  81.      */
  82.     for (int k = 0; k < n; k++) {
  83.         for (int i = 0; i < n; i++)
  84.             for (int j = 0; j < n; j++) {
  85.                 int m = min(distance[i][j], distance[i][k] + distance[k][j]);
  86.                 int tmp = distance[i][j];
  87.                 distance[i][j] = m < 0 ? distance[i][j] : m;                            //  ? :   - выражение,   условие ? если истина : если ложь
  88.                 vtorayatab[i][j] = tmp != distance[i][j] ? k + 1 : vtorayatab[i][j];
  89.         }
  90.  
  91.  
  92.         //Ну я решил выводить полученные данные на каждой итерации, что бы можно было увидеть как меняется таблица с каждой итерацией
  93.         for (int i = 0; i < n; i++) {
  94.             for (int j = 0; j < n; j++) {
  95.                 if (distance[i][j] == INT_MAX)
  96.                     cout << setw(5) << "-";
  97.                 else
  98.                     cout << setw(5) << distance[i][j];
  99.             }
  100.             cout << "     ";
  101.             for (int j = 0; j < n; j++) {
  102.                 cout << setw(3) <<  vtorayatab[i][j];
  103.             }
  104.             cout << endl;
  105.         }
  106.         cout << endl << endl;
  107.     }
  108.  
  109.     return 0;
  110. }
  111.  
  112.  
  113. /*
  114.  * Примеры входящих данных для графов
  115. -------------------------------------
  116. 6
  117. 13
  118. 1 2 60
  119. 1 6 30
  120. 2 3 50
  121. 2 4 20
  122. 3 2 50
  123. 3 4 70
  124. 3 6 40
  125. 4 3 70
  126. 4 5 80
  127. 5 4 80
  128. 5 6 15
  129. 6 3 40
  130. 6 5 15
  131. ------------------------------------
  132. 5
  133. 9
  134. 1 2 30
  135. 1 4 20
  136. 2 3 8
  137. 2 5 22
  138. 2 1 30
  139. 3 5 25
  140. 3 2 8
  141. 4 1 20
  142. 5 4 17
  143.  ----------------------------------
  144.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement