Advertisement
fabis_sparks

Untitled

May 27th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.91 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.     void Exclude() {
  114.         int i, j, k;
  115.         for (i = 0; i < VERTEXES; i++) {
  116.             for (j = 0; j < VERTEXES; j++) {
  117.                 cout << a[i][j] << " ";
  118.             }
  119.             cout << endl;
  120.         }
  121.         int exc_num;
  122.         cout << "How many points be excluded: "; cin >> exc_num; cout << endl;
  123.         int *exc = new int[exc_num];
  124.         for (k = 0; k < exc_num; k++) {
  125.             cout << "Enter point #" << k << ": "; cin >> exc[k];
  126.         }
  127.         for (k = 0; k < exc_num; k++) {
  128.             for (j = 0; j < VERTEXES; j++) {
  129.                 a[exc[k]][j] = 0;
  130.             }
  131.             for (i = 0; i < VERTEXES; i++) {
  132.                 a[i][exc[k]] = 0;
  133.             }
  134.         }
  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.     }
  142.     void Choose() {
  143.         int i, j, k;
  144.         ShowMatrix();
  145.         int rows[VERTEXES];
  146.         for (i = 0; i < VERTEXES; i++) { rows[i] = i; }
  147.         int exc_num;
  148.         cout << "How many points be choosen: "; cin >> exc_num; cout << endl;
  149.         int *exc = new int[exc_num];
  150.         for (i = 0; i < exc_num; i++) {
  151.             cout << "Enter point #" << i << ": "; cin >> exc[i];
  152.         }
  153.        
  154.         // Зануление ненужных
  155.         for (k = 0; k < VERTEXES; k++) {
  156.             if ((std::count(exc, exc + VERTEXES, rows[k])) != 1) {
  157.             //cout << rows [k] << "\t" << (std::count(exc, exc+VERTEXES, rows[k])) << endl; DEBUG INFO
  158.                 for (j = 0; j < VERTEXES; j++) { a[rows[k]][j] = 0; }
  159.                 for (i = 0; i < VERTEXES; i++) { a[i][rows[k]] = 0; }
  160.             }
  161.         }
  162.         cout << endl << endl;
  163.         // Вывод конечной матрицы
  164.         ShowMatrix();
  165.     }
  166. };
  167.  
  168. int main()
  169. {
  170.     setlocale(LC_ALL, "Russian");
  171.     system("cls");
  172.     cout << "1. Only find shortest way\n";
  173.     cout << "2. Only find longest way\n";
  174.     cout << "3. Exclude points from the way and find shortest way\n";
  175.     cout << "4. Exclude points from the way and find longest way\n";
  176.     cout << "5. Use only choosen points and find shortest way\n";
  177.     cout << "6. Use only choosen points and find longest way\n";
  178.     int N;
  179.     cin >> N;
  180.     Graph findw;
  181.     switch (N) {
  182.     case 1: findw.ShortestWay(); break;
  183.     //case 2: findw.LongestWay(); break;
  184.     case 3: findw.Exclude(); findw.ShortestWay(); break;
  185.     //case 4: findw.Exclude(); findw.LongestWay(); break;
  186.     case 5: findw.Choose(); findw.ShortestWay(); break;
  187.     //case 6: findw.Choose(); findw.LongestWay(); break;
  188.     default:
  189.         cout << "Wrong item.\n";
  190.         break;
  191.     }
  192.     system("pause");
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement