Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5.  
  6. const int infinity = INT_MAX;  //обозначение несуществующего пути из одной вершины в другую
  7.  
  8.  
  9. class Graph {
  10.     typedef std::pair<int, char> p_type; //здесь храним длину пути и вершину, через который мы этот путь будем корректировать
  11.     size_t size;  //размер графа (кол-во вершин)
  12.     p_type **matrix;  //матрица смежности
  13.     std::vector<char> V;  //вектор вершин
  14. public:
  15.     //конструктор графа (надо переделать со вводом из файла)
  16.     Graph(std::istream &in) {
  17.         in >> size;
  18.        
  19.         int x = 0;
  20.         char tmp;
  21.         while (x != size) {
  22.             in >> tmp;
  23.             V.push_back(tmp);
  24.             x++;
  25.         }
  26.  
  27.         matrix = new p_type*[size];
  28.         for (size_t i = 0; i < size; ++i) matrix[i] = new p_type[size];
  29.         for (size_t i = 0; i < size; ++i) {
  30.             for (size_t j = 0; j < size; ++j) {
  31.                 in >> matrix[i][j].first;
  32.                 matrix[i][j].second = V[j];
  33.             }
  34.         }
  35.     }
  36.  
  37.     //вывод матрицы на экран
  38.     void show() {
  39.         for (size_t i = 0; i < size; ++i) {
  40.             for (size_t j = 0; j < size; ++j) {
  41.                 std::cout << matrix[i][j].first << "," << matrix[i][j].second << " ";
  42.             }
  43.             std::cout << std::endl;
  44.         }
  45.     }
  46.  
  47.     //дальше методы нашего алгоритма
  48.     void alg_floyd() {
  49.         int x;
  50.         for (size_t k = 0; k < size; ++k) {
  51.             for (size_t i = 0; i < size; ++i) {
  52.                 for (size_t j = 0; j < size; ++j) {
  53.                     if ((k == i) || (k == j) || (i == j)
  54.                         || (matrix[i][k].first == infinity) || (matrix[k][j].first == infinity)) continue;
  55.                     if (matrix[i][j].first >= (matrix[i][k].first + matrix[k][j].first)) {
  56.                         x = (matrix[i][k].first + matrix[k][j].first);
  57.                         matrix[i][j].first = x;
  58.                         matrix[i][j].second = V[k];
  59.                     }
  60.                 }
  61.             }
  62.         }
  63.     }
  64.  
  65.     void short_path(char x, char y) {
  66.         std::cout << x;
  67.         short_path_main(x, y);
  68.         std::cout << y;
  69.     }
  70.  
  71.     void short_path_main (char x, char y) {
  72.         int help_x, help_y;
  73.         help_x = help_y = -1;
  74.         for (int i = 0; i < size; ++i) {
  75.             if (V[i] == x) help_x = i;
  76.             if (V[i] == y) help_y = i;
  77.             if ((help_x >= 0) && (help_y >= 0)) break;
  78.         }
  79.         if ((matrix[help_x][help_y].second == y) || (matrix[help_x][help_y].second == x)) return;
  80.         std::cout << matrix[help_x][help_y].second;
  81.        
  82.         if (matrix[help_x][help_y].second != x) {
  83.             short_path_main(x, matrix[help_x][help_y].second);
  84.             short_path_main(matrix[help_x][help_y].second, y);
  85.         }
  86.     }
  87.  
  88.  
  89. };
  90.  
  91. int main()
  92. {
  93.     std::ifstream in("input.txt");
  94.     Graph object(std::cin);
  95.     object.show();
  96.     std::cout << "\n\n";
  97.     object.alg_floyd();
  98.     object.show();
  99.     std::cout << "Enter vershini: \n";
  100.     char x, y;
  101.     std:: cin >> x >> y;
  102.     object.short_path(x, y);
  103.  
  104.     system("pause");
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement