Advertisement
Kiri3L

Untitled

Dec 19th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <limits>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int MAX_INT = 0;
  9.  
  10. int** create_matrix(int size) {
  11.     int** mas = new int*[size];
  12.     for(int i = 0;i < size;++i)
  13.         mas[i] = new int[size];
  14.     cout << "Matrix allocated" << endl;
  15.     return mas;
  16. }
  17.  
  18. void fill_matrix(int **mas, int size, vector<pair<int,int>> &roads) {
  19.     for(int i = 0;i < size;++i) {
  20.         mas[i][i] = MAX_INT;
  21.         for (int j = i + 1; j < size; ++j) {
  22.             int r;
  23.             cout << "Введите стоимость дороги между вершинами "
  24.                  << i << " и " << j << endl;
  25.             cin >> r;
  26.             if(r != 0){
  27.                 roads.push_back({i,j});
  28.             }
  29.             mas[i][j] = r;
  30.             mas[j][i] = mas[i][j];
  31.         }
  32.     }
  33. }
  34.  
  35. void delete_matrix(int **mas, int size) {
  36.     for(int i = 0;i < size;++i) {
  37.         delete[] mas[i];
  38.     }
  39.     delete[] mas;
  40.     cout << "Matrix deleted" << endl;
  41. }
  42.  
  43. void show_matrix(int** mas, int size) {
  44.     for(int i = 0;i < size;++i) {
  45.         for(int j = 0;j < size;++j) {
  46.             if(mas[i][j] != MAX_INT) {
  47.                 cout << mas[i][j] << " ";
  48.             }
  49.             else {
  50.                 cout << "∞" << " ";
  51.             }
  52.         }
  53.         cout << endl;
  54.     }
  55. }
  56.  
  57. void floid(int** matrix, int n, vector<pair<int,int>> &roads){
  58.     for (int k = 0; k < n; k++){
  59.         for(int i = 0; i < n; i++){
  60.             for(int j = 0; j < n; j++){
  61.                 if(matrix[i][k] == MAX_INT || matrix[k][j] == MAX_INT) continue;
  62.                 int r = matrix[i][k] + matrix[k][j];
  63.                 if(r <= matrix[i][j]){
  64.                     matrix[i][j] = r;
  65.                     auto t = find(roads.begin(),roads.end(),pair<int,int>(i,j));
  66.                     if(t != roads.end()){
  67.                         roads.erase(t);
  68.                     }
  69.                 }
  70.                 matrix[i][j] = min(matrix[i][j],r);
  71.             }
  72.         }
  73.     }
  74. }
  75.  
  76. int main() {
  77.     int n;
  78.     cin >> n;
  79.     int **matrix = create_matrix(n);
  80.     vector<pair<int,int>> roads;
  81.     fill_matrix(matrix,n,roads);
  82.     for(auto i : roads){
  83.         cout << i.first << " " << i.second << endl;
  84.     }
  85.     cout << endl;
  86.     show_matrix(matrix,n);
  87.     floid(matrix,n,roads);
  88.     cout << endl;
  89.     show_matrix(matrix,n);
  90.     cout << endl;
  91.     for(auto i : roads){
  92.         cout << i.first << " " << i.second << endl;
  93.     }
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement