Advertisement
fabis_sparks

CPPLab-Release

May 27th, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.52 KB | None | 0 0
  1. //---------------------------------------------------------------------------
  2. //Алгоритм Дейкстры
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <conio.h>
  6. #define VERTEXES 9  //Число вершин в графе
  7. using namespace std;
  8. class Graph {
  9. public:
  10.     int v;
  11.     int infinity = 1000;                    
  12.     int p = VERTEXES;  
  13.     int a[VERTEXES][VERTEXES] =
  14.     {
  15.         0, 1, 0, 0, 0, 0, 0, 0, 0,
  16.         1, 0, 1, 0, 0, 1, 0, 0, 0,
  17.         0, 1, 0, 1, 1, 0, 0, 0, 0,
  18.         0, 0, 1, 0, 0, 1, 1, 0, 1,
  19.         0, 0, 1, 0, 0, 1, 1, 1, 0,
  20.         0, 1, 0, 1, 1, 0, 0, 0, 0,
  21.         0, 0, 0, 1, 1, 0, 0, 1, 1,
  22.         0, 0, 0, 0, 1, 0, 1, 0, 1,
  23.         0, 0, 0, 1, 0, 0, 1, 1, 0,
  24.  
  25.     };
  26.    
  27.     // Будем искать путь из вершины s в вершину g
  28.     int s=0;                    // Номер исходной вершины
  29.     int g=VERTEXES-1;                   // Номер конечной вершины
  30.     int x[VERTEXES]; //Массив, содержащий единицы и нули для каждой вершины,
  31.                      // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
  32.                      // x[i]=1 - кратчайший путь в i-ю вершину уже найден
  33.     int t[VERTEXES];  //t[i] - длина кратчайшего пути от вершины s в i
  34.     int h[VERTEXES];  //h[i] - вершина, предшествующая i-й вершине
  35.                       // на кратчайшем пути
  36.     bool excludePoints = false;
  37.                       // Инициализируем начальные значения массивов
  38.     int u;          // Счетчик вершин
  39.     void ShowMatrix() {
  40.         int i, j;
  41.         for (i = 0; i < VERTEXES; i++) {
  42.             for (j = 0; j < VERTEXES; j++) {
  43.                 cout << a[i][j] << " ";
  44.             }
  45.             cout << endl;
  46.         }
  47.     }
  48.     void ShortestWay(){
  49.     for (u = 0; u < p; u++)
  50.     {
  51.         t[u] = infinity; //Сначала все кратчайшие пути из s в i
  52.                          //равны бесконечности
  53.         x[u] = 0;        // и нет кратчайшего пути ни для одной вершины
  54.     }
  55.     h[s] = 0; // s - начало пути, поэтому этой вершине ничего не предшествует
  56.     t[s] = 0; // Кратчайший путь из s в s равен 0
  57.     x[s] = 1; // Для вершины s найден кратчайший путь
  58.     v = s;    // Делаем s текущей вершиной
  59.  
  60.     while (1)
  61.     {
  62.         // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
  63.         for (u = 0; u < p; u++)
  64.         {
  65.             if (a[v][u] == 0) continue; // Вершины u и v несмежные
  66.             if (x[u] == 0 && t[u] > t[v] + a[v][u]) //Если для вершины u еще не
  67.                                                   //найден кратчайший путь
  68.                                                   // и новый путь в u короче чем
  69.                                                   //старый, то
  70.             {
  71.                 t[u] = t[v] + a[v][u];  //запоминаем более короткую длину пути в
  72.                                         //массив t и
  73.                 h[u] = v;   //запоминаем, что v->u часть кратчайшего
  74.                             //пути из s->u
  75.             }
  76.         }
  77.  
  78.         // Ищем из всех длин некратчайших путей самый короткий
  79.         int w = infinity;  // Для поиска самого короткого пути
  80.         v = -1;            // В конце поиска v - вершина, в которую будет
  81.                            // найден новый кратчайший путь. Она станет
  82.                            // текущей вершиной
  83.         for (u = 0; u < p; u++) // Перебираем все вершины.
  84.         {
  85.             if (x[u] == 0 && t[u] < w) // Если для вершины не найден кратчайший
  86.                                      // путь и если длина пути в вершину u меньше
  87.                                      // уже найденной, то
  88.             {
  89.                 v = u; // текущей вершиной становится u-я вершина
  90.                 w = t[u];
  91.             }
  92.         }
  93.         if (v == -1)
  94.         {
  95.             cout << "Нет пути из вершины " << s << " в вершину " << g << "." << endl;
  96.             break;
  97.         }
  98.         if (v == g) // Найден кратчайший путь,
  99.         {        // выводим его
  100.             cout << "Кратчайший путь из вершины " << s << " в вершину " << g << ":";
  101.             u = g;
  102.             while (u != s)
  103.             {
  104.                 cout << " " << u;
  105.                 u = h[u];
  106.             }
  107.             cout << " " << s << ". Длина пути - " << t[g];
  108.             break;
  109.         }
  110.         x[v] = 1;
  111.     } }
  112.     void LongestWay() {
  113.         for (u = 0; u < p; u++)
  114.         {
  115.             t[u] = 0; //Сначала все кратчайшие пути из s в i
  116.                              //равны бесконечности
  117.             x[u] = 0;        // и нет кратчайшего пути ни для одной вершины
  118.         }
  119.         h[s] = 0; // s - начало пути, поэтому этой вершине ничего не предшествует
  120.         t[s] = 0; // Кратчайший путь из s в s равен 0
  121.         x[s] = 1; // Для вершины s найден кратчайший путь
  122.         v = s;    // Делаем s текущей вершиной
  123.  
  124.         while (1)
  125.         {
  126.             // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
  127.             for (u = 0; u < p; u++)
  128.             {
  129.                 if (a[v][u] == 0) continue; // Вершины u и v несмежные
  130.                 if (x[u] == 0 && t[u] < t[v] + a[v][u]) //Если для вершины u еще не
  131.                                                         //найден кратчайший путь
  132.                                                         // и новый путь в u короче чем
  133.                                                         //старый, то
  134.                 {
  135.                     t[u] = t[v] + a[v][u];  //запоминаем более короткую длину пути в
  136.                                             //массив t и
  137.                     h[u] = v;   //запоминаем, что v->u часть кратчайшего
  138.                                 //пути из s->u
  139.                 }
  140.             }
  141.  
  142.             // Ищем из всех длин некратчайших путей самый короткий
  143.             int w = 0;  // Для поиска самого короткого пути
  144.             v = -1;            // В конце поиска v - вершина, в которую будет
  145.                                // найден новый кратчайший путь. Она станет
  146.                                // текущей вершиной
  147.             for (u = 0; u < p; u++) // Перебираем все вершины.
  148.             {
  149.                 if (x[u] == 0 && t[u] > w) // Если для вершины не найден кратчайший
  150.                                            // путь и если длина пути в вершину u меньше
  151.                                            // уже найденной, то
  152.                 {
  153.                     v = u; // текущей вершиной становится u-я вершина
  154.                     w = t[u];
  155.                 }
  156.             }
  157.             if (v == -1)
  158.             {
  159.                 cout << "Нет пути из вершины " << s << " в вершину " << g << "." << endl;
  160.                 break;
  161.             }
  162.             if (v == g) // Найден кратчайший путь,
  163.             {        // выводим его
  164.                 cout << "Кратчайший путь из вершины " << s << " в вершину " << g << ":";
  165.                 u = g;
  166.                 while (u != s)
  167.                 {
  168.                     cout << " " << u;
  169.                     u = h[u];
  170.                 }
  171.                 cout << " " << s << ". Длина пути - " << t[g];
  172.                 break;
  173.             }
  174.             x[v] = 1;
  175.         }
  176.     }
  177.     void Exclude() {
  178.         int i, j, k;
  179.         for (i = 0; i < VERTEXES; i++) {
  180.             for (j = 0; j < VERTEXES; j++) {
  181.                 cout << a[i][j] << " ";
  182.             }
  183.             cout << endl;
  184.         }
  185.         int exc_num;
  186.         cout << "How many points be excluded: "; cin >> exc_num; cout << endl;
  187.         int *exc = new int[exc_num];
  188.         for (k = 0; k < exc_num; k++) {
  189.             cout << "Enter point #" << k << ": "; cin >> exc[k];
  190.         }
  191.         for (k = 0; k < exc_num; k++) {
  192.             for (j = 0; j < VERTEXES; j++) {
  193.                 a[exc[k]][j] = 0;
  194.             }
  195.             for (i = 0; i < VERTEXES; i++) {
  196.                 a[i][exc[k]] = 0;
  197.             }
  198.         }
  199.         for (i = 0; i < VERTEXES; i++) {
  200.             for (j = 0; j < VERTEXES; j++) {
  201.                 cout << a[i][j] << " ";
  202.             }
  203.             cout << endl;
  204.         }
  205.     }
  206.     void Choose() {
  207.         int i, j, k;
  208.         ShowMatrix();
  209.         int rows[VERTEXES];
  210.         for (i = 0; i < VERTEXES; i++) { rows[i] = i; }
  211.         int exc_num;
  212.         cout << "How many points be choosen: "; cin >> exc_num; cout << endl;
  213.         int *exc = new int[exc_num];
  214.         for (i = 0; i < exc_num; i++) {
  215.             cout << "Enter point #" << i << ": "; cin >> exc[i];
  216.         }
  217.        
  218.         // Зануление ненужных
  219.         for (k = 0; k < VERTEXES; k++) {
  220.             if ((std::count(exc, exc + VERTEXES, rows[k])) != 1) {
  221.             //cout << rows [k] << "\t" << (std::count(exc, exc+VERTEXES, rows[k])) << endl; DEBUG INFO
  222.                 for (j = 0; j < VERTEXES; j++) { a[rows[k]][j] = 0; }
  223.                 for (i = 0; i < VERTEXES; i++) { a[i][rows[k]] = 0; }
  224.             }
  225.         }
  226.         cout << endl << endl;
  227.         // Вывод конечной матрицы
  228.         ShowMatrix();
  229.     }
  230. };
  231.  
  232. int main()
  233. {
  234.     setlocale(LC_ALL, "Russian");
  235.     system("cls");
  236.     cout << "1. Only find shortest way\n";
  237.     cout << "2. Only find longest way\n";
  238.     cout << "3. Exclude points from the way and find shortest way\n";
  239.     cout << "4. Exclude points from the way and find longest way\n";
  240.     cout << "5. Use only choosen points and find shortest way\n";
  241.     cout << "6. Use only choosen points and find longest way\n";
  242.     int N;
  243.     cin >> N;
  244.     Graph findw;
  245.     switch (N) {
  246.     case 1: findw.ShortestWay(); break;
  247.     case 2: findw.LongestWay(); break;
  248.     case 3: findw.Exclude(); findw.ShortestWay(); break;
  249.     case 4: findw.Exclude(); findw.LongestWay(); break;
  250.     case 5: findw.Choose(); findw.ShortestWay(); break;
  251.     case 6: findw.Choose(); findw.LongestWay(); break;
  252.     default:
  253.         cout << "Wrong item.\n";
  254.         break;
  255.     }
  256.     system("pause");
  257.     return 0;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement