Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- const int MAXN = 50;
- const double INF = 1e9;
- int adj[MAXN][MAXN];
- struct State {
- int pos[3];
- double time;
- State(int p1, int p2, int p3, double t) {
- pos[0] = p1;
- pos[1] = p2;
- pos[2] = p3;
- time = t;
- }
- };
- bool bfs(int n, int m, int startPos[], int speeds[]) {
- queue<State> q;
- q.push(State(startPos[0], startPos[1], (m == 3 ? startPos[2] : 0), 0));
- bool visited[MAXN][MAXN][MAXN] = {false};
- visited[startPos[0]][startPos[1]][(m == 3 ? startPos[2] : 0)] = true;
- while (!q.empty()) {
- State curr = q.front();
- q.pop();
- int pos[] = { curr.pos[0], curr.pos[1], curr.pos[2] };
- double t = curr.time;
- // Check for meeting at a node
- if (m == 2 && pos[0] == pos[1]) {
- cout << "Minimum meeting time: " << t << "\n";
- return true;
- }
- if (m == 3 && pos[0] == pos[1] && pos[1] == pos[2]) {
- cout << "Minimum meeting time: " << t << "\n";
- return true;
- }
- // Move to the next positions
- for (int i = 0; i < n; ++i) {
- if (adj[pos[0]][i]) {
- for (int j = 0; j < n; ++j) {
- if (adj[pos[1]][j]) {
- if (m == 3) {
- for (int k = 0; k < n; ++k) {
- if (adj[pos[2]][k]) {
- double nextTime = t + 1;
- if (!visited[i][j][k]) {
- visited[i][j][k] = true;
- q.push(State(i, j, k, nextTime));
- }
- }
- }
- } else {
- double nextTime = t + 1;
- if (!visited[i][j][0]) {
- visited[i][j][0] = true;
- q.push(State(i, j, 0, nextTime));
- }
- }
- }
- }
- }
- }
- // Check for meeting on the road
- if (m == 2) {
- if (adj[pos[0]][pos[1]]) {
- double travelTime = 1.0 / max(speeds[0], speeds[1]);
- double meetTime = t + travelTime;
- if (fabs(meetTime * speeds[0] - round(meetTime * speeds[0])) < 1e-9 &&
- fabs(meetTime * speeds[1] - round(meetTime * speeds[1])) < 1e-9) {
- cout << "Minimum meeting time: " << meetTime << "\n";
- return true;
- }
- }
- } else if (m == 3) {
- for (int i = 0; i < 3; ++i) {
- int next1 = (i + 1) % 3;
- int next2 = (i + 2) % 3;
- if (adj[pos[i]][pos[next1]] && adj[pos[next1]][pos[next2]]) {
- double travelTime = 1.0 / max({speeds[i], speeds[next1], speeds[next2]});
- double meetTime = t + travelTime;
- if (fabs(meetTime * speeds[i] - round(meetTime * speeds[i])) < 1e-9 &&
- fabs(meetTime * speeds[next1] - round(meetTime * speeds[next1])) < 1e-9 &&
- fabs(meetTime * speeds[next2] - round(meetTime * speeds[next2])) < 1e-9) {
- cout << "Minimum meeting time: " << meetTime << "\n";
- return true;
- }
- }
- }
- }
- }
- return false; // No meeting point found
- }
- int main() {
- freopen("text.txt", "r", stdin);
- int n, m, k;
- cout << "Enter number of points (N): ";
- cin >> n;
- cout << "Enter number of robots (M): ";
- cin >> m;
- cout << "Enter number of roads (K): ";
- cin >> k;
- cout << "Enter roads in the format 'i j length':\n";
- memset(adj, 0, sizeof(adj));
- for (int i = 0; i < k; ++i) {
- int from, to, length;
- cin >> from >> to >> length;
- adj[from][to] = length;
- adj[to][from] = length;
- }
- int startPos[m];
- int speeds[m];
- cout << "Enter starting positions of robots:\n";
- for (int i = 0; i < m; ++i) {
- cin >> startPos[i];
- }
- cout << "Enter speeds of robots:\n";
- for (int i = 0; i < m; ++i) {
- cin >> speeds[i];
- }
- if (!bfs(n, m, startPos, speeds)) {
- cout << "Meeting is impossible\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment