hpnq

лаба графы

Jun 2nd, 2024
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.51 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2.  
  3. using namespace std;
  4.  
  5. const int MAXN = 50;
  6. const double INF = 1e9;
  7.  
  8. int adj[MAXN][MAXN];
  9.  
  10. struct State {
  11.     int pos[3];
  12.     double time;
  13.     State(int p1, int p2, int p3, double t) {
  14.         pos[0] = p1;
  15.         pos[1] = p2;
  16.         pos[2] = p3;
  17.         time = t;
  18.     }
  19. };
  20.  
  21. bool bfs(int n, int m, int startPos[], int speeds[]) {
  22.     queue<State> q;
  23.     q.push(State(startPos[0], startPos[1], (m == 3 ? startPos[2] : 0), 0));
  24.  
  25.     bool visited[MAXN][MAXN][MAXN] = {false};
  26.     visited[startPos[0]][startPos[1]][(m == 3 ? startPos[2] : 0)] = true;
  27.  
  28.     while (!q.empty()) {
  29.         State curr = q.front();
  30.         q.pop();
  31.  
  32.         int pos[] = { curr.pos[0], curr.pos[1], curr.pos[2] };
  33.         double t = curr.time;
  34.  
  35.         // Check for meeting at a node
  36.         if (m == 2 && pos[0] == pos[1]) {
  37.             cout << "Minimum meeting time: " << t << "\n";
  38.             return true;
  39.         }
  40.         if (m == 3 && pos[0] == pos[1] && pos[1] == pos[2]) {
  41.             cout << "Minimum meeting time: " << t << "\n";
  42.             return true;
  43.         }
  44.  
  45.         // Move to the next positions
  46.         for (int i = 0; i < n; ++i) {
  47.             if (adj[pos[0]][i]) {
  48.                 for (int j = 0; j < n; ++j) {
  49.                     if (adj[pos[1]][j]) {
  50.                         if (m == 3) {
  51.                             for (int k = 0; k < n; ++k) {
  52.                                 if (adj[pos[2]][k]) {
  53.                                     double nextTime = t + 1;
  54.                                     if (!visited[i][j][k]) {
  55.                                         visited[i][j][k] = true;
  56.                                         q.push(State(i, j, k, nextTime));
  57.                                     }
  58.                                 }
  59.                             }
  60.                         } else {
  61.                             double nextTime = t + 1;
  62.                             if (!visited[i][j][0]) {
  63.                                 visited[i][j][0] = true;
  64.                                 q.push(State(i, j, 0, nextTime));
  65.                             }
  66.                         }
  67.                     }
  68.                 }
  69.             }
  70.         }
  71.  
  72.         // Check for meeting on the road
  73.         if (m == 2) {
  74.             if (adj[pos[0]][pos[1]]) {
  75.                 double travelTime = 1.0 / max(speeds[0], speeds[1]);
  76.                 double meetTime = t + travelTime;
  77.                 if (fabs(meetTime * speeds[0] - round(meetTime * speeds[0])) < 1e-9 &&
  78.                     fabs(meetTime * speeds[1] - round(meetTime * speeds[1])) < 1e-9) {
  79.                     cout << "Minimum meeting time: " << meetTime << "\n";
  80.                     return true;
  81.                 }
  82.             }
  83.         } else if (m == 3) {
  84.             for (int i = 0; i < 3; ++i) {
  85.                 int next1 = (i + 1) % 3;
  86.                 int next2 = (i + 2) % 3;
  87.                 if (adj[pos[i]][pos[next1]] && adj[pos[next1]][pos[next2]]) {
  88.                     double travelTime = 1.0 / max({speeds[i], speeds[next1], speeds[next2]});
  89.                     double meetTime = t + travelTime;
  90.                     if (fabs(meetTime * speeds[i] - round(meetTime * speeds[i])) < 1e-9 &&
  91.                         fabs(meetTime * speeds[next1] - round(meetTime * speeds[next1])) < 1e-9 &&
  92.                         fabs(meetTime * speeds[next2] - round(meetTime * speeds[next2])) < 1e-9) {
  93.                         cout << "Minimum meeting time: " << meetTime << "\n";
  94.                         return true;
  95.                     }
  96.                 }
  97.             }
  98.         }
  99.     }
  100.  
  101.     return false; // No meeting point found
  102. }
  103.  
  104. int main() {
  105.     freopen("text.txt", "r", stdin);
  106.     int n, m, k;
  107.     cout << "Enter number of points (N): ";
  108.     cin >> n;
  109.     cout << "Enter number of robots (M): ";
  110.     cin >> m;
  111.     cout << "Enter number of roads (K): ";
  112.     cin >> k;
  113.  
  114.     cout << "Enter roads in the format 'i j length':\n";
  115.     memset(adj, 0, sizeof(adj));
  116.     for (int i = 0; i < k; ++i) {
  117.         int from, to, length;
  118.         cin >> from >> to >> length;
  119.         adj[from][to] = length;
  120.         adj[to][from] = length;
  121.     }
  122.  
  123.     int startPos[m];
  124.     int speeds[m];
  125.     cout << "Enter starting positions of robots:\n";
  126.     for (int i = 0; i < m; ++i) {
  127.         cin >> startPos[i];
  128.     }
  129.     cout << "Enter speeds of robots:\n";
  130.     for (int i = 0; i < m; ++i) {
  131.         cin >> speeds[i];
  132.     }
  133.  
  134.     if (!bfs(n, m, startPos, speeds)) {
  135.         cout << "Meeting is impossible\n";
  136.     }
  137.  
  138.     return 0;
  139. }
  140.  
Advertisement
Add Comment
Please, Sign In to add comment