Advertisement
fabis_sparks

Rlsl

May 27th, 2018
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.96 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 ShortestWay(){
  40.     for (u = 0; u < p; u++)
  41.     {
  42.         t[u] = infinity; //Сначала все кратчайшие пути из s в i
  43.                          //равны бесконечности
  44.         x[u] = 0;        // и нет кратчайшего пути ни для одной вершины
  45.     }
  46.     h[s] = 0; // s - начало пути, поэтому этой вершине ничего не предшествует
  47.     t[s] = 0; // Кратчайший путь из s в s равен 0
  48.     x[s] = 1; // Для вершины s найден кратчайший путь
  49.     v = s;    // Делаем s текущей вершиной
  50.  
  51.     while (1)
  52.     {
  53.         // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
  54.         for (u = 0; u < p; u++)
  55.         {
  56.             if (a[v][u] == 0) continue; // Вершины u и v несмежные
  57.             if (x[u] == 0 && t[u] > t[v] + a[v][u]) //Если для вершины u еще не
  58.                                                   //найден кратчайший путь
  59.                                                   // и новый путь в u короче чем
  60.                                                   //старый, то
  61.             {
  62.                 t[u] = t[v] + a[v][u];  //запоминаем более короткую длину пути в
  63.                                         //массив t и
  64.                 h[u] = v;   //запоминаем, что v->u часть кратчайшего
  65.                             //пути из s->u
  66.             }
  67.         }
  68.  
  69.         // Ищем из всех длин некратчайших путей самый короткий
  70.         int w = infinity;  // Для поиска самого короткого пути
  71.         v = -1;            // В конце поиска v - вершина, в которую будет
  72.                            // найден новый кратчайший путь. Она станет
  73.                            // текущей вершиной
  74.         for (u = 0; u < p; u++) // Перебираем все вершины.
  75.         {
  76.             if (x[u] == 0 && t[u] < w) // Если для вершины не найден кратчайший
  77.                                      // путь и если длина пути в вершину u меньше
  78.                                      // уже найденной, то
  79.             {
  80.                 v = u; // текущей вершиной становится u-я вершина
  81.                 w = t[u];
  82.             }
  83.         }
  84.         if (v == -1)
  85.         {
  86.             cout << "Нет пути из вершины " << s << " в вершину " << g << "." << endl;
  87.             break;
  88.         }
  89.         if (v == g) // Найден кратчайший путь,
  90.         {        // выводим его
  91.             cout << "Кратчайший путь из вершины " << s << " в вершину " << g << ":";
  92.             u = g;
  93.             while (u != s)
  94.             {
  95.                 cout << " " << u;
  96.                 u = h[u];
  97.             }
  98.             cout << " " << s << ". Длина пути - " << t[g];
  99.             break;
  100.         }
  101.         x[v] = 1;
  102.     } }
  103.     void LongestWay() {}
  104.     void Exclude() {
  105.         int i, j, k;
  106.         for (i = 0; i < VERTEXES; i++) {
  107.             for (j = 0; j < VERTEXES; j++) {
  108.                 cout << a[i][j] << " ";
  109.             }
  110.             cout << endl;
  111.         }
  112.         int exc_num;
  113.         cout << "How many points be excluded: "; cin >> exc_num; cout << endl;
  114.         int *exc = new int[exc_num];
  115.         for (k = 0; k < exc_num; k++) {
  116.             cout << "Enter point #" << k << ": "; cin >> exc[k];
  117.         }
  118.         for (k = 0; k < exc_num; k++) {
  119.             for (j = 0; j < VERTEXES; j++) {
  120.                 a[exc[k]][j] = 0;
  121.             }
  122.             for (i = 0; i < VERTEXES; i++) {
  123.                 a[i][exc[k]] = 0;
  124.             }
  125.         }
  126.         for (i = 0; i < VERTEXES; i++) {
  127.             for (j = 0; j < VERTEXES; j++) {
  128.                 cout << a[i][j] << " ";
  129.             }
  130.             cout << endl;
  131.         }
  132.     }
  133.     void Choose() {
  134.         int i, j, k;
  135.         for (i = 0; i < VERTEXES; i++) {
  136.             for (j = 0; j < VERTEXES; j++) {
  137.                 cout << a[i][j] << " ";
  138.             }
  139.             cout << endl;
  140.         }
  141.         int exc_num;
  142.         cout << "How many points be choosen: "; cin >> exc_num; cout << endl;
  143.         int *exc = new int[exc_num];
  144.         for (k = 0; k < exc_num; k++) {
  145.             cout << "Enter point #" << k << ": "; cin >> exc[k];
  146.         }
  147.         // Зануление ненужных
  148.         for (k = 0; k < exc_num; k++) {
  149.             if ((std::count(exc, exc + sizeof(exc) / sizeof(*exc), exc[k])) != 1) {
  150.                 cout << exc[k] << "\t" << (std::count(exc, exc + sizeof(exc) / sizeof(*exc), exc[k])) << endl;;
  151.             /*  for (j = 0; j < VERTEXES; j++) {
  152.                     //a[exc[k]][j] = 0;
  153.                    
  154.                 }
  155.                 for (i = 0; i < VERTEXES; i++) {
  156.                     //a[i][exc[k]] = 0;
  157.                 }*/
  158.             }
  159.             else continue;
  160.         }
  161.         cout << endl << endl;
  162.         // Вывод конечной матрицы
  163.         for (i = 0; i < VERTEXES; i++) {
  164.             for (j = 0; j < VERTEXES; j++) {
  165.                 cout << a[i][j] << " ";
  166.             }
  167.             cout << endl;
  168.         }
  169.     }
  170. };
  171.  
  172. int main()
  173. {
  174.     setlocale(LC_ALL, "Russian");
  175.     system("cls");
  176.     cout << "1. Only find shortest way\n";
  177.     cout << "2. Only find longest way\n";
  178.     cout << "3. Exclude points from the way and find shortest way\n";
  179.     cout << "4. Exclude points from the way and find longest way\n";
  180.     cout << "5. Use only choosen points and find shortest way\n";
  181.     cout << "6. Use only choosen points and find longest way\n";
  182.     int N;
  183.     cin >> N;
  184.     Graph findw;
  185.     switch (N) {
  186.     case 1: findw.ShortestWay(); break;
  187.     //case 2: findw.LongestWay(); break;
  188.     case 3: findw.Exclude(); findw.ShortestWay(); break;
  189.     //case 4: findw.Exclude(); findw.LongestWay(); break;
  190.     case 5: findw.Choose(); findw.ShortestWay(); break;
  191.     //case 6: findw.Choose(); findw.LongestWay(); break;
  192.     default:
  193.         cout << "Wrong item.\n";
  194.         break;
  195.     }
  196.     system("pause");
  197.     return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement