Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.22 KB | None | 0 0
  1. #include <clocale>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <iostream>
  8. #include <limits>
  9. #include <vector>
  10. #include <windows.h>
  11.  
  12. using namespace std;
  13.  
  14. const int V = 4;
  15. ofstream  file("C:\\Users\\Ilya\\Desktop\\Alg_Dijkstra.txt"); //Запись в файл
  16.  
  17. //структура для ребра
  18. struct VERTEX {
  19.     double depTime;
  20.     double travelTime;
  21.     double arrTime;
  22. };
  23.  
  24. //алгоритм Дейкстры
  25. double Dijkstra(VERTEX vertex[V][V], int st)
  26. {
  27.     double deadline = 2;
  28.     double distance[V];
  29.     double dis[V];
  30.     double arr[V];
  31.     double dep[V];
  32.     double result[V];
  33.     double d_max = 0;
  34.     int    count, index = 0, i, u, m = st + 1;
  35.     bool   visited[V];
  36.  
  37.     static const double INF = std::numeric_limits<double>::infinity();
  38.     for (i = 0; i < V; i++) {
  39.         distance[i] = INF;
  40.         dis[i]      = INF;
  41.         arr[i]      = INF;
  42.         dep[i]      = INF;
  43.         visited[i]  = false;
  44.     }
  45.     distance[st] = 0;
  46.  
  47.     //Первый шаг алгоритма
  48.     double min = INF;
  49.     for (i = 0; i < V; i++) {
  50.         if (!visited[i] && distance[i] <= min) {
  51.             min   = distance[i];
  52.             index = i;
  53.         }
  54.     }
  55.     u          = index;
  56.     visited[u] = true;
  57.  
  58.     for (i = 0; i < V; i++) {
  59.         if (!visited[i] && vertex[u][i].travelTime > 0 && distance[u] < INF &&
  60.             distance[u] + vertex[u][i].travelTime < INF) {
  61.  
  62.             distance[i] = vertex[u][i].travelTime;
  63.             arr[i]      = vertex[u][i].arrTime;
  64.             dep[i]      = vertex[u][i].depTime;
  65.         }
  66.     }
  67.     //-----------------------------------------—
  68.     // Второй шаг алгоритма
  69.     for (count = 1; count < V - 1; count++) {
  70.         double min = INF;
  71.         for (i = 0; i < V; i++) {
  72.             if (!visited[i] && distance[i] <= min) {
  73.                 min   = distance[i];
  74.                 index = i;
  75.             }
  76.         }
  77.         u          = index;
  78.         visited[u] = true;
  79.         for (i = 0; i < V; i++) {
  80.             if (!visited[i] && vertex[u][i].travelTime > 0 && distance[u] < INF &&
  81.                 distance[u] + (vertex[u][i].depTime - arr[u]) + vertex[u][i].travelTime < distance[i] &&
  82.                 vertex[u][i].depTime - arr[u] >= 0.5) {
  83.  
  84.                 distance[i] = distance[u] + (vertex[u][i].depTime - arr[u]) + vertex[u][i].travelTime;
  85.                 arr[i]      = vertex[u][i].arrTime;
  86.                 dep[i]      = vertex[u][i].depTime;
  87.             }
  88.         }
  89.     }
  90.  
  91.  
  92.     // ОПТИМАЛЬНЫЙ ПО ВРЕМЕНИ
  93.     for (i = 0; i < V; i++) {
  94.         arr[i]     = 0;
  95.         dep[i]     = 0;
  96.         visited[i] = false;
  97.         dis[i]     = INF;
  98.     }
  99.     dis[st] = 0;
  100.  
  101.     //Первый шаг алгоритма
  102.  
  103.     for (i = 0; i < V; i++) {
  104.         if (!visited[i] && dis[i] <= min) {
  105.             min   = dis[i];
  106.             index = i;
  107.         }
  108.     }
  109.     u          = index;
  110.     visited[u] = true;
  111.     for (i = 0; i < V; i++) {
  112.         if (!visited[i] && vertex[u][i].travelTime > 0 && dis[u] < INF && dis[u] + vertex[u][i].travelTime < dis[i]) {
  113.             dis[i] = dis[u] + vertex[u][i].travelTime;
  114.             arr[i] = vertex[u][i].arrTime;
  115.             dep[i] = vertex[u][i].depTime;
  116.         }
  117.     }
  118.     //-----------------------------------------—
  119.     // Второй шаг алгоритма
  120.     for (count = 1; count < V - 1; count++) {
  121.         double min = INF;
  122.         for (i = 0; i < V; i++) {
  123.             if (!visited[i] && dis[i] <= min) {
  124.                 min   = dis[i];
  125.                 index = i;
  126.                 // cout<<min<<endl;
  127.             }
  128.         }
  129.         u          = index;
  130.         visited[u] = true;
  131.         for (i = 0; i < V; i++) {
  132.             if (!visited[i] && vertex[u][i].travelTime > 0 && dis[u] < INF && vertex[u][i].depTime - arr[u] >= 0.5 &&
  133.                 vertex[u][i].depTime - arr[u] <= deadline) {
  134.                 dis[i] = dis[u] + (vertex[u][i].depTime - arr[u]) + vertex[u][i].travelTime;
  135.                 arr[i] = vertex[u][i].arrTime;
  136.                 dep[i] = vertex[u][i].depTime;
  137.             }
  138.         }
  139.     }
  140.  
  141.     for (i = 0; i < V; i++) {
  142.         result[i] = distance[i];
  143.         if (dis[i] <= distance[i]) {
  144.             result[i] = dis[i];
  145.         }
  146.     }
  147.  
  148.  
  149.     // ВЫВОД АЛГОРТИМА
  150.     file << "Distance from the initial vertex to the others:\t\n";
  151.     for (i = 0; i < V; i++) {
  152.         if (result[i] > d_max) {
  153.             d_max = result[i];
  154.         }
  155.         file << m << " -> " << i + 1 << " = " << result[i] << endl;
  156.     }
  157.     file << "Maximum distance:= " << d_max << endl;
  158.     return 0;
  159. }
  160. //главная функция
  161. int main()
  162. {
  163.     int    start;
  164.     VERTEX vertex[V][V] = {{{0, 0, 0}, {5, 3, 8}, {4, 4.5, 8.5}, {0, 0, 0}},
  165.                            {{16, 2.5, 18.5}, {0, 0, 0}, {6, 2.5, 8.5}, {0, 0, 0}},
  166.                            {{13, 6, 18}, {12, 2, 14}, {0, 0, 0}, {9.5, 2, 11.5}},
  167.                            {{0, 0, 0}, {0, 0, 0}, {8, 3, 11}, {0, 0, 0}}};
  168.     for (start = 0; start < V; start++) {
  169.         file << "First vertex " << start << endl;
  170.         Dijkstra(vertex, start);
  171.     }
  172.     system("pause");
  173.     return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement