Advertisement
Guest User

Untitled

a guest
Apr 28th, 2015
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.81 KB | None | 0 0
  1. #include <time.h>
  2. #include <random>
  3. #include <math.h>
  4. #include <iostream>
  5. #include <vector>
  6.  
  7. #define inf 100000
  8.  
  9. using namespace std;
  10.  
  11. // структура для хранения графа в виде ребер
  12. // тут:
  13. // u - левый узел ребра
  14. // v - правый узел ребра
  15. // w - соответственно вес ребра
  16. struct Rebra{
  17.     int rightUzel, leftUzel, weight;
  18. };
  19.  
  20. const int Vmax = 1000; // максимально возможное количество кратчайших путей (берем заведеомо большее число чтобы все уместилось)
  21. const int Emax = Vmax*(Vmax - 1) / 2; // максимальное количество ребер
  22. Rebra rebro[Emax]; //
  23. // массив для хранения кратчайших путей из начального узла во все остальные
  24. // индекс в первых квадратных скобках тут обозначает № узла
  25. // а индексы во вторых скобках имеют смысл:
  26. // 0 - минимальный вес от начального узла до узла который указан в первых скобках кважратных
  27. // 1 - № узла из которого пришли в данный узел
  28. int distanc[Vmax];
  29. int izKakogoUzla[Vmax];
  30. int width_belt, arr[1000][1000];
  31. int i, j, n, kolichestvoReber, p, start, endnode;
  32.  
  33. //алгоритм Беллмана-Форда
  34. // n - количество узлов
  35. // s - стартовая вершина
  36. void bellman_ford(int n, int s)
  37. {
  38.     // присваиваем всем значениям массива для хранения минимальых дистанций огромное число (нужно для корректной работы алгоритма нахождения минимума)
  39.     for (i = 0; i < n; i++)
  40.     {
  41.         distanc[i] = inf;
  42.         izKakogoUzla[i] = -1;
  43.     }
  44.  
  45.     // стартовая вершина имеет нулевой вес (с неё же начинаем все таки)
  46.     distanc[s] = 0;
  47.  
  48.     // собственно основной алгоритм
  49.     for (i = 0; i<n - 1; i++)
  50.     {
  51.         for (j = 0; j<kolichestvoReber; j++)
  52.         {
  53.             // если [путь до A]+B лучше чем уже имеющейся минимальный путь, то записываем этот путь в distance
  54.             if (distanc[rebro[j].leftUzel] + rebro[j].weight < distanc[rebro[j].rightUzel])
  55.             {
  56.                 distanc[rebro[j].rightUzel] = distanc[rebro[j].leftUzel] + rebro[j].weight;
  57.                 izKakogoUzla[rebro[j].rightUzel] = rebro[j].leftUzel; // записываем откуда пришли
  58.             }
  59.         }
  60.     }
  61.  
  62.     cout << "Список кратчайших путей:" << endl;
  63.     for (i = 1; i < n; i++)
  64.     {
  65.         if (distanc[i] == inf)
  66.             cout << start << "->" << i + 1 << "=" << "Нету пути..." << endl;
  67.         else
  68.         {
  69.             vector<int> path;
  70.             for (int cur = i; cur != -1; cur = izKakogoUzla[cur])
  71.                 path.push_back(cur);
  72.             reverse(path.begin(), path.end());
  73.  
  74.             cout << "Путь: " << path[0];
  75.             for (size_t i = 1; i < path.size(); ++i)
  76.                 cout << "->" << path[i];
  77.             cout << " Вес: " << distanc[i] << endl;
  78.         }
  79.     }
  80. }
  81.  
  82. //главная функция
  83. void main()
  84. {
  85.     // устанавливаем кодировку русскую для консоли
  86.     setlocale(LC_ALL, "Rus");
  87.  
  88.     std::default_random_engine generator;
  89.     generator.seed(time(NULL)); // инициализируем генератор случайных чисел
  90.     // тут 10 это среднее число для генерации случайных чисел
  91.     // 5 это дисперсия(разброс) генерации чисел относительно среднего числа (+-10)
  92.     std::normal_distribution<> rnd(10, 5); // нормальное распределение
  93.  
  94.     cout << "Количество вершин > "; cin >> n;
  95.     cout << "Ширина ленточной матрицы > "; cin >> width_belt;
  96.     cout << "Конечная вершина > "; cin >> endnode;
  97.     cout << "Стартовая вершина > "; cin >> start;
  98.  
  99.     cout << "Сгенерированная ленточная матрица" << endl;
  100.     for (int i = 1; i < n; i++)
  101.     {
  102.         for (int j = i + 1; j <= i + width_belt; j++)
  103.         {
  104.             // не заполнять элементы за границей массива
  105.             if (j >= n)
  106.                 break;
  107.  
  108.             // заполняем по строчно
  109.             arr[i][j] = floor(rnd(generator));
  110.             // по столбцу
  111.             arr[j][i] = floor(rnd(generator));
  112.  
  113.         }
  114.     }
  115.  
  116.     // задаем ограничени¤
  117.     arr[0][1] = floor(rnd(generator)); // 1 св¤зан с 2
  118.     arr[0][3] = floor(rnd(generator)); // 1 св¤зан с 4
  119.     arr[3][0] = floor(rnd(generator)); // 1 св¤зан с 2
  120.     arr[1][0] = floor(rnd(generator)); // 1 св¤зан с 4
  121.  
  122.     // выводим сгенерированный массив
  123.     for (int i = 0; i < n; i++)
  124.     {
  125.         for (int j = 0; j < n; j++)
  126.         {
  127.             cout << arr[i][j] << " ";
  128.         }
  129.         cout << endl;
  130.     }
  131.  
  132.     // переводим матрицу в массив ребер для более удобной работы в дальнейшем
  133.     kolichestvoReber = 0;
  134.     cout << "Ребра:" << endl;
  135.     for (i = 0; i < n; i++)
  136.     {
  137.         for (j = 0; j < n; j++)
  138.         {
  139.             if (arr[i][j] != 0)
  140.             {
  141.                 rebro[kolichestvoReber].leftUzel = i;
  142.                 rebro[kolichestvoReber].rightUzel = j;
  143.                 rebro[kolichestvoReber].weight = arr[i][j];
  144.                 kolichestvoReber++;
  145.                 cout << "Вес ребра " << i + 1 << "->" << j + 1 << "=" << arr[i][j] << endl;
  146.             }
  147.         }
  148.     }
  149.  
  150.     // переходим непосредственно к алгоритму вычисления кратчайшего пути
  151.     bellman_ford(n, start);
  152.  
  153.     // чтобы программа сразу же не закрывалась
  154.     system("pause>>void");
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement